通过构造函数注入方法,才能在拦截器中使用,AutoWire方式会报空指针
@Configuration
class WebConfig implements WebMvcConfigurer {
@Autowired
private UserService userService;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor(userService))
// 拦截的请求
.addPathPatterns("/**")
// 不用拦截的请求
.excludePathPatterns("/login");
}
}
拦截器
public class LoginInterceptor implements HandlerInterceptor {
private UserService userService;
public LoginInterceptor(UserService userService) {
this.userService= userService;
}
//在进入目标方法之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader(JwtConstant.HEADER_TOKEN);
if (StringUtils.isEmpty(token)) {
response.setCharacterEncoding(StandardCharsets.UTF_8.displayName());
response.setContentType("application/json; charset=utf-8");
response.getWriter().write("LOGIN_NULL_UTOKEN");
response.setStatus(400);
return false;
}
//校验token时效
String userInfo = userService.getUserSession(token);
if (StringUtils.isBlank(userInfo)) {
response.setCharacterEncoding(StandardCharsets.UTF_8.displayName());
response.setContentType("application/json; charset=utf-8");
response.getWriter().write("LOGIN_INVALID_UTOKEN");
response.setStatus(400);
return false;
}
return true;
}
//在进入目标方法之后,在返回modelandview之前执行
//共用变量的一些设置。
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
//返回modelandview之后,渲染到页面之前
//异常处理 ,清理工作
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}