周振林 周振林
首页
  • 前端文章

    • HTML
    • CSS
    • Tailwind CSS (opens new window)
    • JavaScript
    • Vue3
    • 其他
  • Spring
  • SpringMVC
  • Mybatis
  • 安装教程
  • 其他教程
  • 基础
  • 虚拟化
  • Docker
  • OpenStack
  • 心情杂货
关于
收藏

周振林

IT界的小学生
首页
  • 前端文章

    • HTML
    • CSS
    • Tailwind CSS (opens new window)
    • JavaScript
    • Vue3
    • 其他
  • Spring
  • SpringMVC
  • Mybatis
  • 安装教程
  • 其他教程
  • 基础
  • 虚拟化
  • Docker
  • OpenStack
  • 心情杂货
关于
收藏
  • Spring

  • SpringMVC

    • SpringMVC路径映射
    • SpringMVC请求处理
    • SpringMVC响应请求
    • SpringMVC拦截器
      • Interceptor拦截器
        • Interceptor介绍
        • 过滤器和拦截器的区别
        • 自定义 Interceptor
        • 配置Interceptor
        • 案例
        • 创建拦截器
        • 配置拦截器
        • 测试拦截器
    • SpringMVC过滤器
    • SpringMVC异常
    • SpringBoot数据校验
  • Mybatis

  • 安装教程

  • 其他教程

  • 后端
  • SpringMVC
周振林
2024-05-22
目录

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

注意:

  • 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

doc3293ba0942014c99a8415be26b92f86f.png

# 案例

# 创建拦截器

  • 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

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

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

# 配置拦截器


@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

# 测试拦截器

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public Object hello(){
        return "hello";
    }
}
1
2
3
4
5
6
7
8
Last Updated: 2025/12/02, 11:22:00
SpringMVC响应请求
SpringMVC过滤器

← SpringMVC响应请求 SpringMVC过滤器→

最近更新
01
查询优化N+1
12-02
02
项目代码组织方式
12-02
03
Mybatis分页插件
12-02
更多文章>
Copyright © 2019-2025 鲁ICP备19032096号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×