用浏览器打开一个网站并登录了,如果我这时不再对该网站有任何操作,那么系统分配给我的线程什么时候会回收到线程池?我的疑惑是如果不是很快就回收的话不是会浪费资源吗,比如我十分钟都不操作了,这时应该要回收了;如果回收了,我下次再登录,应该会重新再分配一个线程给我,但是保存在上一个线程中的ThreadLocal变量不就没有了吗,比如spring security把Authentication保存在了线程的ThreadLocal变量中,新分配给我的线程怎么重新拿到Authentication?
跟cookie关系大了。
服务器收到请求后,在身份验证阶段,会从cookie中获取信息,用这些数据建立当前请求的身份信息,也就是你所说的Authentication,之后把这个Authentication存放到用来处理当前请求的线程的ThreadLocal中。
第一次登录,是从request作用域中获取的验证信息,你说的意思是第一次验证过之后,下次再连接到系统的另一个新的线程是从cookie中获取的验证信息,是吗?
@天才宝宝:
不管登录了还是没登录,服务器受到请求后总是要读取COOKIE用来重建Authentication
如果没登录过,那么重建Authentication的结果就是匿名用户,如果登录过,则是特定的某个用户。
任何一个用户,不管他是匿名的还是登录过的,发出请求达到服务器后,服务器不管用哪个线程来处理这个请求,上面说的身份验证的过程总是要执行的。
每次请求,从线程池分配一个线程处理请求,请求处理完,线程立即释放回线程池,才不会理你接下来是否继续进行操作
所以我就理解不了,Spring Security把Authentication放在线程的ThreadLocal中,当这个线程被释放后系统重新分配一个线程的时候,如何把Authentication再放到新的线程中的。
@天才宝宝: 根据客户端的cookies
@dudu: 哪里有详细的说明吗,我看源代码,没有看出跟session有什么关系,跟cookie更没有关系吧。