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登录拦截器用户信息存储内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
- springboot在filter中如何用threadlocal存放用户身份信息
- SpringBoot中的ThreadLocal保存请求用户信息的实例demo
- SpringBoot ThreadLocal 简单介绍及使用详解
- SpringBoot+ThreadLocal+AbstractRoutingDataSource实现动态切换数据源
- Springboot公共字段填充及ThreadLocal模块改进方案
- SpringBoot ThreadLocal实现公共字段自动填充案例讲解
- SpringBoot通过ThreadLocal实现登录拦截详解流程
- springboot 使用ThreadLocal的实例代码
- SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结
相关文章
在SpringBoot中使用YourKit进行性能调优的教程详解
在应用程序的开发过程中,性能调优是一个重要的环节,在SpringBoot应用程序中,我们可以使用YourKit来进行性能调优,YourKit是一款非常强大的Java性能调优工具,在本文中,我们将介绍如何在 SpringBoot应用程序中使用YourKit进行性能调优2023-06-06
Java自带定时任务ScheduledThreadPoolExecutor实现定时器和延时加载功能
今天小编就为大家分享一篇关于Java自带定时任务ScheduledThreadPoolExecutor实现定时器和延时加载功能,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-12-12
spring Data jpa简介_动力节点Java学院整理
这篇文章主要介绍了spring Data jpa简介的相关资料,需要的朋友可以参考下2017-09-09


最新评论