1. 编写拦截器组件,实现 HandlerInterceptor 接口
注意Java在这个接口中的新特性 default 默认已经实现了接口方法
Alt+Enter快捷键在Idea中无法弹出实现的窗口,可以通过 Ctrl+O 快捷键选择重写界面
@Componentpublic class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("======preHandle========="); //return HandlerInterceptor.super.preHandle(request, response, handler); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("======postHandle========="); HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("======afterCompletion========="); HandlerInterceptor.super.afterCompletion(request, response, handler, ex); }}
2. 编写配置组件,实现接口 WebMvcConfigurer
同样,它默认实现了接口,顾使用Ctrl+O 选择重新接口
@Configurationpublic class MyInterceptorConfiguration implements WebMvcConfigurer{ @Autowired MyInterceptor interceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(interceptor).addPathPatterns(”/**/getall"); WebMvcConfigurer.super.addInterceptors(registry); }}
知识点:addPathPatterns():
/** - /**: 匹配所有路径 - /admin/**:匹配 /admin/ 下面的所有路径 - /secure/*:只匹配 /secure/user,不匹配 /secure/user/info */截止效果如图所示:
过滤器、拦截器和AOP的区别
过滤器
过滤器可以拦截方法的请求和响应(ServletRequest request, SetvletResponse response),并对请求响应做出响应的过滤操作,如设置字符编码、鉴权操作等。
拦截器
拦截器可以在方法之前使用(preHandle)和方法执行后(afterCompletion)操作,回调操作(postHandle),执行方法的名称可以获得,请求(HttpServletRequest)。
AOP切片
AOP操作可以横向拦截操作。最大的优点是可以获得执行方法的参数,统一处理方法、常用日志、事务、请求参数安全验证等。
顺序
请求->>过滤器->>拦截器-->Aspect->>拦截器->>过滤器->>响应