拦截器入门
Sunday 2023/11/19 javaSpringMvc
# 拦截器入门
在Controller层执行前后都设置一个共用的处理装置
# 拦截器和过滤器的区别
- 归属不同,过滤器(Filter)是servlet的技术,拦截器(Interceptor)是属于SpringMvc的技术
- 拦截内容不同:Filter对所有访问进行增强,Interceptor只对SpringMvc的进行增强
# 1、配置拦截器
实现接口HandlerInterceptor,记得加上
@Component注解
让Spring能管理到该拦截器
写个测试语句测试一下
@Component
public class ProjectInterceptor implements HandlerInterceptor{
/***
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器的前置调用");
return true;
}
/***
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器的post调用");
}
/***
* 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器的后置调用");
}
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
添加配置类,继承
WebMvcConfigurationSupport
,重写addInterceptor()
来添加配置拦截器拦截的路径
@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {
private final ProjectInterceptor projectInterceptor;
@Autowired
public InterceptorConfig(ProjectInterceptor projectInterceptor) {
this.projectInterceptor = projectInterceptor;
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(projectInterceptor)
.addPathPatterns("/**")//添加拦截路径
//添加不拦截路径
.excludePathPatterns();
}
}
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
# 2、配置多个拦截器-拦截器链
像这样再调用
registry
的addInterceptor
方法就行了
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");
}
1
2
3
4
5
2
3
4
5
# 2.1 设置执行顺序
preHandle()
方法是先注册的先执行,而剩下的两个方法是后进入的先执行
# 2.2 单独设置执行顺序
如果想单独设置也可以使用order()
方法
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*").order(1);
registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*").order(0);
}
1
2
3
4
5
2
3
4
5
如代码所示,order小的先注册执行
多个拦截器执行顺序,当有拦截器返回false时的流程图