目录
2、TSUserContext 把用户信息放到context中
1、WebConfig 配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private AccessControlInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册自定义拦截器LoginInterceptor
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**") // 拦截所有的请求
.excludePathPatterns("/","/images/**");//排除指定请求
}
}
2、TSUserContext 把用户信息放到context中
@Component
public class TSUserContext {
private static final String ACCESS_TOKEN = "ACCESS_TOKEN";
public void setCurrentUser(TSUser user) {
RequestContextHolder.currentRequestAttributes().setAttribute(ACCESS_TOKEN, user, RequestAttributes.SCOPE_REQUEST);
}
public TSUser getCurrentUser() {
return (TSUser) RequestContextHolder.currentRequestAttributes().getAttribute(ACCESS_TOKEN, RequestAttributes.SCOPE_REQUEST);
}
}
3、自定义拦截器
@Component
public class AccessControlInterceptor implements HandlerInterceptor {
@Value("${TOKEN_SECRET}")
private String TOKEN_SECRET;
@Resource
private TSUserContext userContext;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 获取用户信息
TSUser tsUser = TokenProccessor.getInstance().verifyToken(request.getHeader("access_token"), TOKEN_SECRET);
if (tsUser == null) { // 没有获取到用户信息
// 设置响应状态码为 401
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
// 设置响应内容为 JSON 格式的错误信息
String errorMessage = "{\"error\": \"access_token 已经失效,请重新登录\"}";
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(errorMessage);
return false; // 验证失败,不继续处理请求
} else {
Class clazz = Class.forName("com.ggzy.support.context.TSUser");
com.ggzy.support.context.TSUser user = (com.ggzy.support.context.TSUser) clazz.getDeclaredConstructor().newInstance();
//com.ggzy.support.context.TSUser tsUser2 = new com.ggzy.support.context.TSUser();
BeanUtils.copyProperties(tsUser, user);
//设置用户信息
userContext.setCurrentUser(user);
return true;
}
}
}
4、在controller中可以使用
@RestController
public class xxController {
@Resource
private TSUserContext userContext;
}