首页 新闻 会员 周边 捐助

线程的生命周期

0
悬赏园豆:20 [已解决问题] 解决于 2018-01-22 23:18

用浏览器打开一个网站并登录了,如果我这时不再对该网站有任何操作,那么系统分配给我的线程什么时候会回收到线程池?我的疑惑是如果不是很快就回收的话不是会浪费资源吗,比如我十分钟都不操作了,这时应该要回收了;如果回收了,我下次再登录,应该会重新再分配一个线程给我,但是保存在上一个线程中的ThreadLocal变量不就没有了吗,比如spring security把Authentication保存在了线程的ThreadLocal变量中,新分配给我的线程怎么重新拿到Authentication?

唯学而知的主页 唯学而知 | 初学一级 | 园豆:186
提问于:2018-01-16 13:23
< >
分享
最佳答案
0

跟cookie关系大了。

服务器收到请求后,在身份验证阶段,会从cookie中获取信息,用这些数据建立当前请求的身份信息,也就是你所说的Authentication,之后把这个Authentication存放到用来处理当前请求的线程的ThreadLocal中。

收获园豆:20
西漠以西 | 小虾三级 |园豆:1675 | 2018-01-17 15:09

第一次登录,是从request作用域中获取的验证信息,你说的意思是第一次验证过之后,下次再连接到系统的另一个新的线程是从cookie中获取的验证信息,是吗?

唯学而知 | 园豆:186 (初学一级) | 2018-01-18 17:41

@天才宝宝: 

不管登录了还是没登录,服务器受到请求后总是要读取COOKIE用来重建Authentication

如果没登录过,那么重建Authentication的结果就是匿名用户,如果登录过,则是特定的某个用户。

任何一个用户,不管他是匿名的还是登录过的,发出请求达到服务器后,服务器不管用哪个线程来处理这个请求,上面说的身份验证的过程总是要执行的。

西漠以西 | 园豆:1675 (小虾三级) | 2018-01-18 17:48
其他回答(1)
0

每次请求,从线程池分配一个线程处理请求,请求处理完,线程立即释放回线程池,才不会理你接下来是否继续进行操作

dudu | 园豆:30778 (高人七级) | 2018-01-16 13:34

所以我就理解不了,Spring Security把Authentication放在线程的ThreadLocal中,当这个线程被释放后系统重新分配一个线程的时候,如何把Authentication再放到新的线程中的。

支持(0) 反对(0) 唯学而知 | 园豆:186 (初学一级) | 2018-01-16 13:41

@天才宝宝: 根据客户端的cookies

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2018-01-16 13:54

@dudu: 哪里有详细的说明吗,我看源代码,没有看出跟session有什么关系,跟cookie更没有关系吧。

支持(0) 反对(0) 唯学而知 | 园豆:186 (初学一级) | 2018-01-16 14:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册