ThreadLocal可以将用户信息保存在线程中,当请求结束后我们在把保存的信息清除掉。更方便,可以从ThreadLocal中直接获取用户信息而不需要使用依赖传递的方式,搞清楚ThreadLocal的用法
示例
public class demo() {
//普通用法
public List test(sysUser user) {
return userService.getByuserId(user.getId());
}
//ThreadLocal用法
public List test1() {
return userService.getByuserId(ThreadLocal.getCurrentUser().getId());
}
}
/**
* 保存用户对象的ThreadLocal
*
* @author wangql
*/
@Component
public class UserInfoThreadHandler{
private static final ThreadLocal<SysUser> userThreadLocal = new ThreadLocal<>();
/**
* 添加当前登录用户方法
*/
public static void addCurrentUser() {
//登录对象从这里获取然后set进ThreadLocal
//具体根据业务逻辑来
SysUser user = LoginHelper.getLoginUser();
userThreadLocal.set(user);
}
public static SysUser getCurrentUser() {
return userThreadLocal.get();
}
/**
* 防止内存泄漏
*/
public static void remove() {
userThreadLocal.remove();
}
}
可以利用拦截器操作
/**
* 将登录用户存入ThreadLocal
* @author wangql
*/
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
UserInfoThreadHolder.addCurrentUser();
return true;
}
/**
* 避免内存泄露
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserInfoThreadHolder.remove();
}
}
注册拦截器
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
//注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor).addPathPatterns("/**");
}
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addExposedHeader("Authorization");
return corsConfiguration;
}
/**
* 配置跨域
* @return
*/
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig());
return new CorsFilter(source);
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT")
.maxAge(3600);
}
}