SpringMVC 自定义拦截器
# SpringMVC 自定义拦截器
前言
在Spring MVC中,拦截器(Interceptor)可以帮助我们在请求进入控制器(Controller)之前、之后以及视图渲染完成后执行一些通用逻辑。常见的应用场景包括权限校验、日志记录、性能监控等。通过实现WebMvcConfigurer
接口,并重写addInterceptors
方法,可以轻松地将自定义拦截器注册到Spring MVC中。
# 1. 自定义拦截器的配置
在Spring Boot项目中,你可以通过在配置类中实现WebMvcConfigurer
接口并重写addInterceptors
方法来注册自定义拦截器:
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册自定义拦截器,并指定拦截和排除的路径
registry.addInterceptor(myInterceptor())
.addPathPatterns("/test3") // 指定拦截路径
.excludePathPatterns("/test4"); // 指定不拦截的路径
}
@Bean
public MyInterceptor myInterceptor() {
// 将自定义拦截器注册为Spring管理的Bean
return new MyInterceptor();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
关键配置说明:
addInterceptor
:用于添加拦截器实例。addPathPatterns
:指定拦截的请求路径,可以使用通配符匹配多个路径,例如/api/**
。excludePathPatterns
:指定不拦截的请求路径,可以用于排除特定路径。@Bean
:将拦截器注册为Spring管理的Bean,确保其生命周期由Spring控制,方便在拦截器中使用依赖注入。
# 2. 自定义拦截器的实现
自定义拦截器需要实现HandlerInterceptor
接口,该接口定义了三个主要的方法:
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 请求处理之前调用(Controller方法调用之前)
// 这里可以进行一些预处理,比如权限检查、日志记录等
System.out.println("====== MyInterceptor.preHandle ======");
// 返回true继续流程(如调用下一个拦截器或处理器);返回false则中断流程,通常需要通过response来响应
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 请求处理之后调用,但在视图渲染之前(Controller方法调用之后)
// 这里可以对模型数据进行处理或对视图进行修改
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 整个请求结束后调用,在DispatcherServlet渲染视图之后执行(通常用于资源清理)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
关键方法解析:
preHandle
:- 该方法在请求被处理之前调用(在Controller方法执行之前)。通常用于做权限检查、数据验证、日志记录等。
- 返回值:
true
:表示继续处理该请求(执行下一个拦截器或最终的处理器)。false
:表示中断请求,通常会在此方法中通过response
对象直接返回响应。
- 示例场景:
- 检查用户是否已登录。
- 验证请求参数的合法性。
postHandle
:- 该方法在Controller方法执行之后,但在视图渲染之前调用。可以用于对请求处理结果进行进一步加工或修改。
- 示例场景:
- 在返回结果之前动态添加或修改数据。
- 调整视图解析逻辑或修改响应头。
afterCompletion
:- 该方法在整个请求结束之后调用(在视图渲染完成之后)。常用于资源清理、日志记录等操作。
- 示例场景:
- 记录请求处理的最终状态(成功或失败)。
- 释放数据库连接、关闭文件等资源。
# 3. 拦截器的测试
为了验证拦截器的工作,我们可以创建简单的Controller,并测试不同路径的请求:
@RestController
public class TestController {
@GetMapping("/test3")
public String test3() {
return "This is test3 endpoint";
}
@GetMapping("/test4")
public String test4() {
return "This is test4 endpoint";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
请求示例:
测试路径
/test3
:- URL:
http://localhost:8080/test3
- 控制台输出:
====== MyInterceptor.preHandle ======
1- 返回结果:
This is test3 endpoint
说明:
/test3
路径被拦截器拦截,成功输出日志。- URL:
测试路径
/test4
:- URL:
http://localhost:8080/test4
- 控制台无拦截器日志输出。
- 返回结果:
This is test4 endpoint
说明:
/test4
路径未被拦截器拦截,直接返回响应。- URL:
# 4. 适用场景
拦截器是一个灵活且强大的工具,适用于以下场景:
- 全局日志记录:记录每个请求的进出时间、处理时间、请求参数等。
- 权限校验:在请求进入Controller之前,检查用户是否具备访问权限。
- 通用数据处理:在请求处理前或返回结果前,处理一些通用逻辑,如添加公共响应数据。
# 5. 注意事项
- 拦截器的注册顺序很重要,Spring MVC会按照注册的顺序依次执行拦截器。
- 使用
excludePathPatterns
可以精确排除不需要拦截的路径,例如登录、注册接口等。
# 6. 拦截器与过滤器的区别
- 拦截器(Interceptor):基于Spring MVC,作用于Controller层,可以访问Spring容器中的Bean。
- 过滤器(Filter):基于Servlet规范,作用范围更广,可以在整个请求生命周期中工作(包括静态资源、所有请求)。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08