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

目录
相关文章
|
1月前
|
存储 PHP
25 Session判断用户登录
路老师分享PHP语言知识,帮助大家入门并深入了解PHP。本文介绍如何使用Session管理用户登录,包括创建登录页面、处理登录逻辑、获取Session数据及退出登录功能。纯干货,技术知识分享。
33 2
|
4月前
|
数据安全/隐私保护
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
该博客文章通过示例演示了如何使用session对象的`setAttribute`和`getAttribute`方法在不同页面间传递和显示用户的用户名和密码信息,并说明了如何设置会话的有效期。
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
|
7月前
|
Shell 数据库
学习笔记应用——创建用户账户并且拥有自己的信息
学习笔记应用——创建用户账户并且拥有自己的信息
|
7月前
|
存储 前端开发 Java
①实现基于session的登录流程:发送验证码、登录注册、校验登陆状态
①实现基于session的登录流程:发送验证码、登录注册、校验登陆状态
246 0
|
存储 数据安全/隐私保护
使用session记住用户登录信息
使用session记住用户登录信息
271 0
|
存储 缓存 JavaScript
07设置用户头像的大小 授权获取用户的信息 缓存
07设置用户头像的大小 授权获取用户的信息 缓存
07设置用户头像的大小 授权获取用户的信息 缓存
[导入]用户登录及验证用户是否登录的代码
用户登录及验证用户是否登录的代码文章来源:http://blog.csdn.net/jyk/archive/2006/08/15/1067382.aspx
702 0
|
数据安全/隐私保护
9、获取用户的详细信息接口,如果用户没有登录,我们提示用户登录
controller: //获取用户详细信息接口,当用户没有登录,我们强制让其登录 @RequestMapping(value = "get_information.
1147 0