SpringMVC拦截器
# Interceptor拦截器
# Interceptor介绍
SpringMVC 内置拦截器机制 ,允许在请求被目标方法处理的前后进行拦截,执行一些额外操作;比如:权限验证、日志记录、数据共享等
Spring Interceptor是一个非常类似于Servlet Filter 的概念 。
# 过滤器和拦截器的区别
| 拦截器 | 过滤器 | |
|---|---|---|
| 接口 | HandlerInterceptor | Filter |
| 定义 | Spring 框架 | Servlet 规范 |
| 放行 | preHandle 返回 true 放行请求 | chain.doFilter() 放行请求 |
| 整合性 | 可以直接整合Spring容器的所有组件 | 不受Spring容器管理,无法直接使用容器中组件 需要把它放在容器中,才可以继续使用 |
| 拦截范围 | 拦截 SpringMVC 能处理的请求 | 拦截Web应用所有请求 |
| 总结 | SpringMVC的应用中,推荐使用拦截器 |
# 自定义 Interceptor
如果你需要自定义 Interceptor 的话必须实现 org.springframework.web.servlet.HandlerInterceptor接口并且需要重写下面下面3个方法:
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler)
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView)
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
注意:
- preHandle方法返回 true或 false。如果返回 true,则意味着请求将继续到达 Controller目标方法 被处理。
- preHandle返回true,afterCompletion 方法才会执行,而且是倒序执行
- postHandle是controller目标方法执行之后,才执行
# 配置Interceptor
配置拦截器,需要实现WebMvcConfigurer并重写addInterceptors方法
@Component
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(firstInterceptor).addPathPatterns("/api/*");
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9

# 案例
# 创建拦截器
- FirstInterceptor:拦截所有请求
- SecondInterceptor:拦截所有请求
- ThreeInterceptor:拦截所有请求
FirstInterceptor
@Component
public class FirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor1---preHandle");
request.setAttribute("start",System.currentTimeMillis());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("FirstInterceptor1---postHandle");
Long start= (Long) request.getAttribute("start");
Long end=System.currentTimeMillis();
System.out.println("请求执行时间:"+(end-start));
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("FirstInterceptor1---afterCompletion");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SecondInterceptor
@Component
public class SecondInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("SecondInterceptor2---preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("SecondInterceptor2---postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("SecondInterceptor2---afterCompletion");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ThreeInterceptor
@Component
public class ThreeInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("ThreeInterceptor3---preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("ThreeInterceptor3---postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("ThreeInterceptor3---afterCompletion");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 配置拦截器
@Component
public class WebConfig implements WebMvcConfigurer {
@Autowired
private FirstInterceptor firstInterceptor;
@Autowired
private SecondInterceptor secondInterceptor;
@Autowired
private ThreeInterceptor threeInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(firstInterceptor)
.addPathPatterns("/**");
registry.addInterceptor(secondInterceptor)
.addPathPatterns("/**");
registry.addInterceptor(threeInterceptor)
.addPathPatterns("/**");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 测试拦截器
@RestController
public class HelloController {
@RequestMapping("/hello")
public Object hello(){
return "hello";
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Last Updated: 2025/12/02, 11:22:00