ThreadLocal 方式存储用户信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThreadLocal 方式存储用户信息相关的知识,希望对你有一定的参考价值。

参考技术A

因为每次业务层 或者 其他非 Controller 层,需要用到用户信息的时候,就需要把当前用户信息先查询出来在传递,或者是直接把当前的 session 直接往下层传递。这样很繁琐。
可以使用 线程封闭 性来优化这个问题。

1.每次请求的时候,可能不是同一个线程去执行,会到导致用户数据获取不到。
2.线程要释放绑定的用户数据,不然会出现内存泄露的问题。

先创建 ThreadLocal 操作类

用户session操作类,针对 ThreadLocal 操作二次封装

定义一个 Filter 解决,每次请求不是同一个线程,造成用户信息获取不到问题

定义一个 Request 上下文监听器,用于释放线程绑定的用户信息,避免内存泄露
这里也可以选择 Spring Mvc提供的拦截器。但是我这里选择用 Servlet 的原生接口实现

看看结果:

Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。下面将介绍几种常用的监听器,以及它们都适合运用于那些环境。
分类及介绍:
1. ServletContextListener :用于监听WEB 应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener 接口。
2. ServletContextAttributeListener :用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口。
3. ServletRequestListener : 用于监听请求的创建于销毁, 需要实现 javax.servlet.ServletRequestListener​ 接口
4. ServletRequestAttributeListener :请求属性事件监听器。用于监听请求中的属性改变的事件。
5. HttpSessionListener :用于监听Session对象的创建和销毁,监听器类需要实现javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者两个都实现。
6. HttpSessionActivationListener :用于监听Session对象的钝化/活化事件,监听器类需要实现javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者两个都实现。
7. HttpSessionAttributeListener :用于监听Session对象属性的改变事件,监听器类需要实现
8. HttpSessionBindingListener :会话值绑定事件监听器。这是唯一不需要在web.xml中设定的Listener。
9. Filter :用于在客户端的请求访问后端资源之前,拦截这些请求 或者 在服务器的响应发送回客户端之前,处理这些响应

ThreadLocal存储用户信息,实现项目是全局随处获取用户信息

ThreadLocal作用

以上是关于ThreadLocal 方式存储用户信息的主要内容,如果未能解决你的问题,请参考以下文章

ThreadLocal实现session中用户信息 的线程间共享(精)

再谈Token认证,如何快速方便获取用户信息

SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递

SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递

由会话信息保存认识ThreadLocal

ThreadLocal的使用场景及使用方式