拦截器入门

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

添加配置类,继承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、配置多个拦截器-拦截器链

像这样再调用registryaddInterceptor方法就行了

@Override
public void addInterceptors(InterceptorRegistry registry) {
	registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
	registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");
}
1
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

如代码所示,order小的先注册执行

多个拦截器执行顺序,当有拦截器返回false时的流程图

image-20231018172438996

最后更新于: 2024/2/27 17:14:39