1.创建配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor).addPathPatterns("/demo/**"); //拦截的路径
}
}
2.创建拦截器例子(下面只写了最常用的preHandle方法)
preHandle() :这个方法在业务处理器处理请求之前被调用,可以在此方法中做一些权限的校验。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
postHandle() :这个方法在业务处理器处理请求之后,渲染视图之前调用。在此方法中可以对ModelAndView中的模型和视图进行处理。
afterCompletion() :这个方法在 DispatcherServlet 完全处理完请求后被调用(即视图渲染完成之后),可以在该方法中进行一些资源清理的操作。
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
**如果在控制器中使用了@CrossOrigin注解一定要在前面添加下面这个if语句,
因为preHandle()方法在@CrossOrigin生效前执行,不添加会跨域错误**
if (!(handler instanceof HandlerMethod)) {
return true;
}
String token = request.getHeader("token");
token = token == null ? "" : token;
Boolean res = jwtTokenUtil.isJwtExpired(token);
if (res){
return true;
}
String string = JSONObject.toJSONString(Result.getMessageResult(null, "401"));
PrintWriter out = response.getWriter();
out.write(string);
return false;
}
}