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

    • HTML
    • CSS
    • Tailwind CSS (opens new window)
    • JavaScript
    • Vue3
    • 其他
  • 学习笔记

    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript》
    • 《Vue》
    • 《Git》
    • 《小程序笔记》
    • 《JS设计模式总结笔记》
  • 规范
  • Spring
  • 安装教程
  • 其他教程
  • 归真医学
  • 常用药材
  • 学习笔记
  • 经方学习心得
  • 基础
  • 虚拟化
  • Docker
  • OpenStack
  • 心情杂货
关于
收藏
  • 分类
  • 标签
  • 归档

周振林

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

    • HTML
    • CSS
    • Tailwind CSS (opens new window)
    • JavaScript
    • Vue3
    • 其他
  • 学习笔记

    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript》
    • 《Vue》
    • 《Git》
    • 《小程序笔记》
    • 《JS设计模式总结笔记》
  • 规范
  • Spring
  • 安装教程
  • 其他教程
  • 归真医学
  • 常用药材
  • 学习笔记
  • 经方学习心得
  • 基础
  • 虚拟化
  • Docker
  • OpenStack
  • 心情杂货
关于
收藏
  • 分类
  • 标签
  • 归档
  • 规范

  • Spring

    • Spring基础
    • Spring IoC
    • Spring AOP
    • SpringBoot异常
    • SpringBoot过滤器
    • SpringBoot拦截器
      • Interceptor拦截器
        • Interceptor介绍
        • 过滤器和拦截器的区别
        • 自定义 Interceptor
        • 配置Interceptor
        • 案例
        • 创建拦截器
        • 配置拦截器
        • 测试拦截器
    • Response设置响应编码
    • 依赖start和依赖BOM区别
    • Thymeleaf教程
  • 安装教程

  • 其他教程

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

SpringBoot拦截器

# Interceptor拦截器

# Interceptor介绍

拦截器(Interceptor)同 Filter 过滤器一样,它俩都是面向切面编程——AOP 的具体实现(AOP切面编程只是一种编程思想而已)。

你可以使用 Interceptor 来执行某些任务,例如在 Controller 处理请求之前编写日志,添加或更新配置......

在 Spring中,当请求发送到 Controller 时,在被Controller处理之前,它必须经过 Interceptors(0或更多)。

Spring Interceptor是一个非常类似于Servlet Filter 的概念 。

# 过滤器和拦截器的区别

对于过滤器和拦截器的区别:

  • 过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。
  • 拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。

# 自定义 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 被处理。

# 配置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:拦截所有请求
  • OldLoginInterceptor:拦截/api/oldLogin请求

FirstInterceptor


@Component
public class FirstInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("FirstInterceptor-prehandle-进入");
        System.out.println("FirstInterceptor-prehandle-请求uri:"+request.getRequestURI());
        request.setAttribute("start",System.currentTimeMillis());

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("FirstInterceptor-postHandle-进入");
        System.out.println("FirstInterceptor-postHandle-请求uri:"+request.getRequestURI());

        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 {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        System.out.println("FirstInterceptor-afterCompletion-进入");

    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

SecondInterceptor


@Component
public class SecondInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("SecondInterceptor-prehandle-进入");
        System.out.println("SecondInterceptor-prehandle-请求uri:"+request.getRequestURI());

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("SecondInterceptor-postHandle-进入");
        System.out.println("SecondInterceptor-postHandle-请求uri:"+request.getRequestURI());
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("SecondInterceptor-afterCompletion-进入");
        System.out.println("SecondInterceptor-postHandle-请求uri:"+request.getRequestURI());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

OldLoginInterceptor

/**
 * 如果你请求的地址是 /api/oldLogin 则跳转到 /api/login
 */
@Component
public class OldLoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("OldLoginInterceptor-prehandle-进入");
        System.out.println("OldLoginInterceptor-prehandle-请求uri:"+request.getRequestURI());
        response.sendRedirect("/api/login");

        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("OldLoginInterceptor-postHandle-进入");
        System.out.println("OldLoginInterceptor-postHandle-请求uri:"+request.getRequestURI());
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("OldLoginInterceptor-afterCompletion-进入");
        System.out.println("OldLoginInterceptor-afterCompletion-请求uri:"+request.getRequestURI());
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 配置拦截器


@Data
@Component
public class WebConfig implements WebMvcConfigurer {

    private final FirstInterceptor firstInterceptor;
    private final SecondInterceptor secondInterceptor;
    private final OldLoginInterceptor oldLoginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(firstInterceptor).addPathPatterns("/api/*");
        registry.addInterceptor(secondInterceptor).addPathPatterns("/api/*");
        registry.addInterceptor(oldLoginInterceptor).addPathPatterns("/api/oldLogin");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 测试拦截器

@RestController
@RequestMapping("/api")
public class HelloController {

    @RequestMapping("/hello")
    public Object hello() throws InterruptedException {
        Thread.sleep(2000);
        return "hello";
    }

    @RequestMapping("/login")
    public Object login()  {
        return "login page";
    }

    @RequestMapping("/oldLogin")
    public Object oldLogin() {
        return "oldLogin page";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

源码地址 (opens new window)

Last Updated: 2024/07/26, 16:12:04
SpringBoot过滤器
Response设置响应编码

← SpringBoot过滤器 Response设置响应编码→

最近更新
01
Docker安装
06-10
02
Docker运行JAR
06-10
03
Docker部署MySQL
06-10
更多文章>
Copyright © 2019-2025 鲁ICP备19032096号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式