ThreadLocal实现登录(保存用户登录信息)

简介: ThreadLocal可以将用户信息保存在线程中,当请求结束后我们在把保存的信息清除掉。这样我们才开发的时候就可以直接从全局的ThreadLocal中很方便的获取用户信息。使用ThreadLocal,可以在同一线程中很方便的获取用户信息,不需要频繁的传递session对象。

使用ThreadLocal好处

ThreadLocal可以将用户信息保存在线程中,当请求结束后我们在把保存的信息清除掉。这样我们才开发的时候就可以直接从全局的ThreadLocal中很方便的获取用户信息。


使用ThreadLocal,可以在同一线程中很方便的获取用户信息,不需要频繁的传递session对象。


ThreadLocal实现流程

  • 首先创建ThreadLocal类,在其中设置相关的添加、获取以及删除方法。
  • 创建登录拦截器,重写其中的preHandle()afterCompletion()方法。
  • 注册拦截器

在日常开发中我们可以根据自己需要去获取用户信息,比如从token解析等

ThreadLocal实现流程

  • 首先创建ThreadLocal类,在其中设置相关的添加、获取以及删除方法。
  • 创建登录拦截器,重写其中的preHandle()afterCompletion()方法。
  • 注册拦截器

在日常开发中我们可以根据自己需要去获取用户信息,比如从token解析等


代码实现:

ThreadLocal类:

packagecom.huing.blog.utils;
importcom.huing.blog.dao.pojo.SysUser;
/*** @author huing* @create 2022-06-24 14:01*/publicclassUserThreadLocal {
privateUserThreadLocal(){}
privatestaticfinalThreadLocal<SysUser>LOCAL=newThreadLocal<>();
publicstaticvoidput(SysUsersysUser){
LOCAL.set(sysUser);
    }
publicstaticSysUserget(){
returnLOCAL.get();
    }
publicstaticvoidremove(){
LOCAL.remove();
    }
}


拦截器:

preHandle()方法中根据自己的需要将用户的登录信息存放之ThreadLocal中即可。

然后最后记得清除相关数据以避免内存泄漏

packagecom.huing.blog.handler;
importcom.alibaba.fastjson.JSON;
importcom.huing.blog.dao.pojo.SysUser;
importcom.huing.blog.service.LoginService;
importcom.huing.blog.utils.UserThreadLocal;
importcom.huing.blog.vo.ErrorCode;
importcom.huing.blog.vo.Result;
importlombok.extern.slf4j.Slf4j;
importorg.apache.commons.lang3.StringUtils;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importorg.springframework.web.method.HandlerMethod;
importorg.springframework.web.servlet.HandlerInterceptor;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/*** @author huing* @create 2022-06-24 13:14*/@Component@Slf4jpublicclassLoginInterceptorimplementsHandlerInterceptor {
@AutowiredprivateLoginServiceloginService;
@OverridepublicbooleanpreHandle(HttpServletRequestrequest, HttpServletResponseresponse, Objecthandler) throwsException {
//登录验证成功,放行//我希望在controller中直接获取用户的信息怎么获取UserThreadLocal.put(sysUser);
returntrue;
    }
@OverridepublicvoidafterCompletion(HttpServletRequestrequest, HttpServletResponseresponse, Objecthandler, Exceptionex) throwsException {
//如果不删 ThreadLocal中用完的信息会有内存泄漏的风险UserThreadLocal.remove();
    }
}

注册自定义拦截器:

packagecom.huing.blog.config;
importcom.huing.blog.handler.LoginInterceptor;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.web.servlet.config.annotation.CorsRegistry;
importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;
importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/*** @author huing* @create 2022-06-11 18:45*/@ConfigurationpublicclassWebMVCConfigimplementsWebMvcConfigurer {
@AutowiredprivateLoginInterceptorloginInterceptor;
@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry) {
//假设拦截test接口 后续实际遇到拦截的接口是时,再配置真正的拦截接口//        registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login").excludePathPatterns("/register");    //拦截所有,排除登录注册接口registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/test")
                .addPathPatterns("/comments/create/change")
                .addPathPatterns("/articles/publish");
    }
}

自行编写接口测试,直接通过ThreadLocal返回用户的登录信息

packagecom.huing.blog.controller;
importcom.huing.blog.dao.pojo.SysUser;
importcom.huing.blog.utils.UserThreadLocal;
importcom.huing.blog.vo.Result;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
/*** @author huing* @create 2022-06-24 13:34*/@RestController@RequestMapping("test")
publicclassTestController {
@RequestMappingpublicResulttest(){
SysUsersysUser=UserThreadLocal.get();
System.out.println(sysUser);
returnResult.success(null);
    }
}

目录
相关文章
|
存储 API
一种新的方法来存储用户信息——ThreadLocal
一种新的方法来存储用户信息——ThreadLocal
1862 0
|
网络协议 算法 网络性能优化
|
消息中间件 监控 Java
Spring Boot中的RabbitMQ死信队列魔法:从异常到延迟,一网打尽【RabbitMQ实战 一】
Spring Boot中的RabbitMQ死信队列魔法:从异常到延迟,一网打尽【RabbitMQ实战 一】
1027 0
|
SQL JavaScript Java
Spring Boot 3 整合 Mybatis-Plus 实现数据权限控制
本文介绍了如何在Spring Boot 3中整合MyBatis-Plus实现数据权限控制,通过使用MyBatis-Plus提供的`DataPermissionInterceptor`插件,在不破坏原有代码结构的基础上实现了细粒度的数据访问控制。文中详细描述了自定义注解`DataScope`的使用方法、`DataPermissionHandler`的具体实现逻辑,以及根据用户的不同角色和部门动态添加SQL片段来限制查询结果。此外,还展示了基于Spring Boot 3和Vue 3构建的前后端分离快速开发框架的实际应用案例,包括项目的核心功能模块如用户管理、角色管理等,并提供Gitee上的开源仓库
3038 11
|
SQL 缓存 关系型数据库
MySQL Limit实现原理
本文深入解析了MySQL中`LIMIT`子句的实现原理及其在分页、性能优化等场景下的应用技巧。文章详细介绍了`LIMIT`的基本语法、MySQL内部处理流程,以及如何通过索引优化、覆盖索引等策略提升分页查询的性能,并提供了实践建议。
957 3
|
设计模式 缓存 Java
谷粒商城笔记+踩坑(14)——异步和线程池
初始化线程的4种方式、线程池详解、异步编排 CompletableFuture
谷粒商城笔记+踩坑(14)——异步和线程池
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
688 8
|
存储 前端开发 Java
深入剖析ThreadLocal使用场景、实现原理、设计思想
深入剖析ThreadLocal使用场景、实现原理、设计思想
深入剖析ThreadLocal使用场景、实现原理、设计思想
|
安全 前端开发 Java
Spring Security的授权管理器实现
Spring Security的授权管理器涉及用户登录后的token验证和权限检查。当用户携带token访问时,框架会验证token合法性及用户访问权限。自定义授权管理器`TokenAuthorizationManager`需实现`AuthorizationManager&lt;RequestAuthorizationContext&gt;`接口,处理校验逻辑,包括解析token、判断用户角色与访问资源的匹配。配置中在`SecurityConfig`注册该管理器以生效。测试表明,具有不同角色的用户可访问相应权限的资源,否则返回403错误。
505 4
|
JSON 数据格式
详解Jackson的动态属性设置@JsonAnyGetter和@JsonAnySetter
详解Jackson的动态属性设置@JsonAnyGetter和@JsonAnySetter

热门文章

最新文章