抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文学习了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接口:

java
1
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 {
/**
* 在目标方法执行之前执行
* @param request 请求对象
* @param response 响应对象
* @param handler 处理器对象
* @return true表示继续执行,false表示中断执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行DemoInterceptor.preHandle()方法");
// 获取请求URI
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);
// 可以在这里进行权限检查、登录验证等操作
// 如果验证失败,返回false中断请求
// 如果验证成功,返回true继续执行后续拦截器和目标方法
return true;
}
/**
* 在目标方法执行之后,视图渲染之前执行
* @param request 请求对象
* @param response 响应对象
* @param handler 处理器对象
* @param modelAndView 模型视图对象
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("执行DemoInterceptor.postHandle()方法");
// 可以在这里修改模型数据或视图信息
}
/**
* 在整个请求完成之后执行(无论成功还是失败都会执行)
* @param request 请求对象
* @param response 响应对象
* @param handler 处理器对象
* @param ex 异常对象(如果有异常的话)
*/
@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 配置拦截器

配置拦截器:

java
1
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 执行顺序

当注册了多个拦截器时,它们的执行顺序遵循以下规则:

  1. 执行preHandle()方法,按注册顺序执行。
  2. 执行postHandle()方法,按注册顺序逆序执行。
  3. 执行afterCompletion()方法,按注册顺序逆序执行。

评论