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);
    }
}

目录
相关文章
|
9月前
|
存储 API
一种新的方法来存储用户信息——ThreadLocal
一种新的方法来存储用户信息——ThreadLocal
904 0
|
9月前
|
存储 前端开发 Java
深入剖析ThreadLocal使用场景、实现原理、设计思想
深入剖析ThreadLocal使用场景、实现原理、设计思想
深入剖析ThreadLocal使用场景、实现原理、设计思想
|
9月前
|
存储 前端开发
通过session实现用户的登录与登出功能
通过session实现用户的登录与登出功能
286 0
|
9月前
|
存储 前端开发 Java
①实现基于session的登录流程:发送验证码、登录注册、校验登陆状态
①实现基于session的登录流程:发送验证码、登录注册、校验登陆状态
275 0
|
存储 缓存 NoSQL
springboot之使用redistemplate优雅地操作redis
概述 本文内容主要 关于spring-redis 关于redis的key设计 redis的基本数据结构 介绍redis与springboot的整合 sringboot中的redistemplate的使用 之前看了很多博客,大都都只是粗略的介绍,这里想要记录的全面一些,也算是一个学习的过程 首发于...
9915 0
|
存储 缓存 Java
面试必杀技,讲一讲Spring中的循环依赖
纠正业界对循环依赖的几个错误认知,明确三级缓存的真正作用
26250 16
|
存储 NoSQL Java
场景应用:利用Redis实现分布式Session
场景应用:利用Redis实现分布式Session
2098 0
|
存储 NoSQL 算法
搞懂单点登录SSO,基于SpringBoot+JWT实现单点登录解决方案
单点登录是目前比较流行的企业业务整合的解决方案之一。单点登录是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。例如:百度旗下有很多的产品,比如百度贴吧、百度知道、百度文库等,只要登录百度账号,在任何一个地方都是已登录状态,不需要重新登录。 单点登录是互联网应用和企业级平台中的基础组件服务。接下来就介绍单点登录的原理,并基于SpringBoot +JWT实现单点登录解决方案。
14715 2
搞懂单点登录SSO,基于SpringBoot+JWT实现单点登录解决方案
|
SQL 算法 安全
零基础上手秒杀系统(二):令牌桶限流 + 再谈超卖
本篇主要讲解接口限流措施,接口限流其实定义也非常广,接口限流本身也是系统安全防护的一种措施,暂时列举这几种容易理解的: 令牌桶限流 单用户访问频率限流 抢购接口隐藏
1203 0
|
缓存 监控 安全
Spring AOP 详细深入讲解+代码示例
Spring AOP(Aspect-Oriented Programming)是Spring框架提供的一种面向切面编程的技术。它通过将横切关注点(例如日志记录、事务管理、安全性检查等)从主业务逻辑代码中分离出来,以模块化的方式实现对这些关注点的管理和重用。 在Spring AOP中,切面(Aspect)是一个模块化的关注点,它可以跨越多个对象,例如日志记录、事务管理等。切面通过定义切点(Pointcut)和增强(Advice)来介入目标对象的方法执行过程。 切点是一个表达式,用于匹配目标对象的一组方法,在这些方法执行时切面会被触发。增强则定义了切面在目标对象方法执行前、执行后或抛出异常时所
10615 3

热门文章

最新文章