ThreadLocal可以将用户信息保存在线程中,当请求结束后我们在把保存的信息清除掉。这样我们才开发的时候就可以直接从全局的ThreadLocal中很方便的获取用户信息。
使用ThreadLocal,可以在同一线程中很方便的获取用户信息,不需要频繁的传递session对象。
ThreadLocal实现流程- 首先创建ThreadLocal类,在其中设置相关的添加、获取以及删除方法。
- 创建登录拦截器,重写其中的preHandle()和afterCompletion()方法。
- 注册拦截器
在日常开发中我们可以根据自己需要去获取用户信息,比如从token解析等
代码实现:ThreadLocal类:
package com.huing.blog.utils;
import com.huing.blog.dao.pojo.SysUser;
public class UserThreadLocal {
private UserThreadLocal(){}
private static final ThreadLocal LOCAL = new ThreadLocal<>();
public static void put(SysUser sysUser){
LOCAL.set(sysUser);
}
public static SysUser get(){
return LOCAL.get();
}
public static void remove(){
LOCAL.remove();
}
}
拦截器:
在preHandle()方法中根据自己的需要将用户的登录信息存放之ThreadLocal中即可。
然后最后记得清除相关数据以避免内存泄漏
package com.huing.blog.handler;
import com.alibaba.fastjson.JSON;
import com.huing.blog.dao.pojo.SysUser;
import com.huing.blog.service.LoginService;
import com.huing.blog.utils.UserThreadLocal;
import com.huing.blog.vo.ErrorCode;
import com.huing.blog.vo.Result;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
@Autowired
private LoginService loginService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登录验证成功,放行
//我希望在controller中直接获取用户的信息怎么获取
UserThreadLocal.put(sysUser);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//如果不删 ThreadLocal中用完的信息会有内存泄漏的风险
UserThreadLocal.remove();
}
}
注册自定义拦截器:
package com.huing.blog.config;
import com.huing.blog.handler.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//假设拦截test接口 后续实际遇到拦截的接口是时,再配置真正的拦截接口
// registry.addInterceptor(loginInterceptor).addPathPatterns("
@RestController
@RequestMapping("test")
public class TestController {
@RequestMapping
public Result test(){
SysUser sysUser = UserThreadLocal.get();
System.out.println(sysUser);
return Result.success(null);
}
}



