一,编写UserThreadLocal类
public class UserThreadLocal {
private static final ThreadLocal<User> LOCAL = new ThreadLocal<>();
private UserThreadLocal(){
}
/**
* 将对象放入到ThreadLocal
*
* @param user
*/
public static void set(User user){
LOCAL.set(user);
}
/**
* 返回当前线程中的User对象
*
* @return
*/
public static User get(){
return LOCAL.get();
}
/**
* 删除当前线程中的User对象
*/
public static void remove(){
LOCAL.remove();
}
}
二,编写tokenInterCepter
package com.tanhua.server.interceptor;
@Component
public class UserTokenIntercepter implements HandlerInterceptor {
@Autowired
private UserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//校验handler是否是handlerMethod
if (!(handler instanceof MethodHandle)) {
return true;
}
//判断是否包含noAuthorization注解,如果包含,直接放行
if (((HandlerMethod)handler).hasMethodAnnotation(NoAuthorization.class)) {
return true;
}
//如果没有,从请求头中获取token信息放入threadLocal
String token = request.getHeader("Authorization");
if (StrUtil.isNotEmpty(token)) {
User user = this.userService.queryUserByToken(token);
if (user != null) {
UserThreadLocal.set(user);
return true;
}
}
response.setStatus(401);
return false;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
三,编写注解NoAuthorization
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented //标记注解
public @interface NoAuthorization {
}
四,注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private RedisCacheInterceptor redisCacheInterceptor;
@Autowired
private UserTokenIntercepter userTokenIntercepter;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(this.userTokenIntercepter).addPathPatterns("/**");
registry.addInterceptor(this.redisCacheInterceptor).addPathPatterns("/**");
}
}
五,使用threadLocal
public PageResult queryPublishList(Integer page, Integer pageSize) {
PageResult pageResult = new PageResult();
pageResult.setPage(page);
pageResult.setPagesize(pageSize);
//获取User对象,无需对User对象校验,其一定不为null
User user = UserThreadLocal.get();
PageInfo<Publish> pageInfo = this.quanZiApi.queryPublishList(user.getId(), page, pageSize);
//。。。。代码略。。。。。
return pageResult;
}