Spring boot 拦截器 配置很简单,比Spring Mvc 更加方便配置。
1、实现HandlerInterceptor
所有的拦截器需要实现HandlerInterceptor,可重写preHandle,postHandle,afterCompletion
我这边写了自定义的注解,用来匿名接口。
拦截Controller接口,进行验证出来,false则拦截
1 public class HttpInterceptor implements HandlerInterceptor 2 { 3 @Override 4 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 5 { 6 if (handler instanceof HandlerMethod) 7 { 8 HandlerMethod handlerMethod = (HandlerMethod) handler; 9 // 获取方法上的注解 10 AllowAnonymous allowAnonymous = handlerMethod.getMethod().getAnnotation(AllowAnonymous.class); 11 // 如果方法上的注解为空 则获取类的注解 12 if (allowAnonymous == null) 13 { 14 allowAnonymous = handlerMethod.getMethod().getDeclaringClass().getAnnotation(AllowAnonymous.class); 15 } 16 if (allowAnonymous != null) 17 { 18 boolean value = allowAnonymous.value(); 19 if (value) 20 { 21 System.out.println(String.format("Method:%s,匿名", handlerMethod.getMethod())); 22 return true; 23 } 24 } 25 String token = request.getHeader("token"); 26 if (token != "123456") 27 { 28 System.out.println(String.format("Method:%s,验证不成功", handlerMethod.getMethod())); 29 return false; 30 } 31 32 } 33 return true; 34 } 35 36 /** 37 * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后) 38 * 39 * @param request 40 * @param response 41 * @param handler 42 * @param modelAndView 43 * @throws Exception 44 */ 45 @Override 46 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception 47 { 48 //System.out.println("执行了TestInterceptor的postHandle方法"); 49 } 50 51 /** 52 * 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作) 53 * 54 * @param request 55 * @param response 56 * @param handler 57 * @param ex 58 * @throws Exception 59 */ 60 @Override 61 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception 62 { 63 //System.out.println("执行了TestInterceptor的afterCompletion方法"); 64 } 65 }
2、配置启用
很简单,只有继承WebMvcConfigurer,重写addInterceptors,将自定义的拦截器加入即可,可配置不拦截哪些路径,比如静态文件等。
1 @Configuration 2 public class HttpInterceptorConfig implements WebMvcConfigurer 3 { 4 @Override 5 public void addInterceptors(InterceptorRegistry registry) 6 { 7 InterceptorRegistration registration = registry.addInterceptor(new HttpInterceptor()); 8 //所有路径都被拦截 9 registration.addPathPatterns("/**"); 10 //添加不拦截路径 11 registration.excludePathPatterns( 12 //登录 13 "/login", 14 //html静态资源 15 "/**/*.html", 16 //js静态资源 17 "/**/*.js", 18 //css静态资源 19 "/**/*.css", 20 "/**/*.woff", 21 "/**/*.ttf" 22 ); 23 } 24 }