springboot登录拦截器+ThreadLocal实现用户信息存储的实例代码
作者:彭于晏689
ThreadLocal 为变量在每个线程中创建了一个副本,这样每个线程都可以访问自己内部的副本变量,这篇文章主要介绍了springboot登录拦截器+ThreadLocal实现用户信息存储的实例代码,需要的朋友可以参考下
ThreadLocal
- 是什么
从名字我们就可以看到ThreadLocal 叫做本地线程变量,意思是说,ThreadLocal 中填充的的是当前线程的变量,该变量对其他线程而言是封闭且隔离的,ThreadLocal 为变量在每个线程中创建了一个副本,这样每个线程都可以访问自己内部的副本变量。
1、在进行对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束。
2、线程间数据隔离
3、进行事务操作,用于存储线程事务信息。
4、数据库连接,Session会话管理。
- 内部实现
创建了ThreadLocalMap用来保存数据
static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } } }
内部继承弱引用,当map为空时会被gc回收
- 四种引用类型
– 强引用:除非为null,内存不足也不会进行回收
– 弱引用:内存不足时GC会将其回收
– 软应用:无论是否有用,GC时会将其回收
– 虚引用:近似于没有引用,用于跟踪对象被垃圾回收器回收的活动
@Component public class HostHolder { private ThreadLocal<User> users = new ThreadLocal<>(); public User getUser() { return users.get(); } public void setUser(User user) { users.set(user); } public void clear() { users.remove(); } }
用ThreadLocal保存user数据
下面实例代码介绍登录拦截器+ThreadLocal实现用户信息存储
/** * 登录拦截器 */ public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理之前进行调用,返回true则继续向下执行,返回false则中断请求 String loginId = request.getHeader("loginId"); if (StringUtils.isNotBlank(loginId)) { // 如果请求头中包含loginId,将其设置到LoginContextHolder中 LoginContextHolder.set("loginId", loginId); } return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行,主要是做清理工作 // 移除LoginContextHolder中的loginId LoginContextHolder.remove(); } }
到此这篇关于springboot登录拦截器+ThreadLocal实现用户信息存储的实例代码的文章就介绍到这了,更多相关springboot登录拦截器用户信息存储内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!