ThreadLocal在SpringMVC中如何使用

ThreadLocal在SpringMVC中如何使用

问题描述:

老师您好,在之前的SpringBoot电商项目中,有一节说到了用户过滤器,拦截请求将用户信息保存,后续controller层方法直接获取用户信息,当时在过滤器中直接使用了static静态变量来保存,我现在想要使用ThreadLocal,该如何使用呢?是在用户过滤器中使用ThreadLocal还是其他地方,过滤器和控制器在容器中默认应该是单例多线程的吧?如果在用户过滤器中使用,那到控制器获取ThreadLocal的时候,它们是不是同一个线程中的呢?

相关截图:

http://img1.sycdn.imooc.com//climg/60ae1c1c09f023be12140684.jpg

http://img1.sycdn.imooc.com//climg/60ae1c9b091bc12112120684.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕阿满 2021-05-26 19:09:41

同学你好,可以新创建一个工具类,在该类中定义ThreadLocal用来存储用户信息,并且有设置,获取,移除用户信息的方法。ThreadLocal中的变量可以通过session做一个中转配置,每次请求都判断session中是否存在用户信息,如果session中存在用户信息就将用户信息保存到ThreadLocal中。

过滤器和控制器在容器中默认单例的。过滤器和控制器中的线程不是同一个。

祝学习愉快~

  • 提问者 无语对斜阳 #1

    谢谢老师,我还有疑问,在controller中如何获取ThreadLocal中的用户信息呢,因为过滤器和控制器的线程不是同一个,而ThreadLocal可以在同一个线程的不同方法共享信息,感觉还是用不起来呀,我倒是有一个思路,希望老师给点意见,在新创建的工具类中定义静态属性ConCurrentHashMap,map中key是sessionid,value是用户信息,这样可以在controller中获取,但是这样请求参数就必须包含session,感觉又绕回去了,还不如直接通过session获取用户信息

    2021-05-26 20:02:26
  • 好帮手慕阿满 回复 提问者 无语对斜阳 #2

    同学你好,如果使用map,map中的key设置为sessionId,传递的参数中需要有session,是又绕回去了。建议同学可以参考上边同学给出的连接。祝学习愉快~

    2021-05-27 11:17:14
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师