摘要:本文学习了SpringMVC中的拦截器机制。
环境
Windows 10 企业版 LTSC 21H2
Java 1.8
Tomcat 8.5.50
Maven 3.6.3
Spring 5.2.25.RELEASE
1 概述
拦截器(Interceptor)类似于Servlet中的过滤器(Filter),主要用于拦截用户的请求并做相应的处理,可以用于权限验证、登录检查、日志记录、性能监控等场景。
拦截器与过滤器的区别:
| 特性 |
过滤器 |
拦截器 |
| 所属规范 |
Servlet规范 |
Spring框架 |
| 执行时机 |
请求进入Servlet之前 |
Controller方法调用前后 |
| 依赖容器 |
依赖Servlet容器 |
依赖Spring容器 |
| 获取组件 |
无法直接获取Spring组件 |
可以注入Spring组件 |
| 处理范围 |
所有请求(包括静态资源) |
主要针对Controller请求 |
| 执行顺序 |
链式调用 |
基于配置顺序或注解 |
2 使用
2.1 自定义拦截器
自定义拦截器需要实现HandlerInterceptor接口:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| public class DemoInterceptor implements HandlerInterceptor {
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("执行DemoInterceptor.preHandle()方法"); String uri = request.getRequestURI(); System.out.println("请求URI: " + uri); String method = request.getMethod(); System.out.println("请求方法: " + method); String queryString = request.getQueryString(); System.out.println("请求参数: " + queryString); return true; }
@Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("执行DemoInterceptor.postHandle()方法"); }
@Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("执行DemoInterceptor.afterCompletion()方法"); if (ex != null) { System.out.println("请求处理发生异常: " + ex.getMessage()); } } }
|
2.3 配置拦截器
配置拦截器:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @Configuration @EnableWebMvc @ComponentScan("com.example.controller") public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new DemoInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/static/**"); } }
|
3 执行顺序
当注册了多个拦截器时,它们的执行顺序遵循以下规则:
- 执行
preHandle()方法,按注册顺序执行。
- 执行
postHandle()方法,按注册顺序逆序执行。
- 执行
afterCompletion()方法,按注册顺序逆序执行。
条