程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • SpringMVC

    • SpringMVC 入门
    • Spring MVC 数据接收
    • Spring MVC 数据返回
    • Spring MVC 路径匹配规则
    • Spring MVC 内容协商策略
    • Spring MVC 异步请求处理
    • Spring MVC 静态资源处理
    • Spring MVC 自定义格式化器
    • SpringMVC 自定义拦截器
      • 1. 自定义拦截器的配置
      • 2. 自定义拦截器的实现
      • 3. 拦截器的测试
      • 4. 适用场景
      • 5. 注意事项
      • 6. 拦截器与过滤器的区别
    • SpringMVC 配置跨域(CORS)
    • Spring MVC 自定义视图控制器
    • Spring MVC 自定义视图解析器
    • Spring MVC 自定义方法参数解析器
    • Spring MVC 自定义返回值处理器
    • Spring MVC 自定义消息转换器
    • Spring MVC 消息转换器扩展
    • Spring MVC 自定义异常处理器
    • Spring MVC 自定义异常处理器扩展
  • SpringMVC
  • SpringMVC
scholar
2024-08-17
目录

SpringMVC 自定义拦截器

# SpringMVC 自定义拦截器

前言

在Spring MVC中,拦截器(Interceptor)可以帮助我们在请求进入控制器(Controller)之前、之后以及视图渲染完成后执行一些通用逻辑。常见的应用场景包括权限校验、日志记录、性能监控等。通过实现WebMvcConfigurer接口,并重写addInterceptors方法,可以轻松地将自定义拦截器注册到Spring MVC中。

# 1. 自定义拦截器的配置

在Spring Boot项目中,你可以通过在配置类中实现WebMvcConfigurer接口并重写addInterceptors方法来注册自定义拦截器:

@Configuration
public class MyWebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册自定义拦截器,并指定拦截和排除的路径
        registry.addInterceptor(myInterceptor())
                .addPathPatterns("/test3") // 指定拦截路径
                .excludePathPatterns("/test4"); // 指定不拦截的路径
    }

    @Bean
    public MyInterceptor myInterceptor() {
        // 将自定义拦截器注册为Spring管理的Bean
        return new MyInterceptor();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

关键配置说明:

  • addInterceptor:用于添加拦截器实例。
  • addPathPatterns:指定拦截的请求路径,可以使用通配符匹配多个路径,例如/api/**。
  • excludePathPatterns:指定不拦截的请求路径,可以用于排除特定路径。
  • @Bean:将拦截器注册为Spring管理的Bean,确保其生命周期由Spring控制,方便在拦截器中使用依赖注入。

# 2. 自定义拦截器的实现

自定义拦截器需要实现HandlerInterceptor接口,该接口定义了三个主要的方法:

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 请求处理之前调用(Controller方法调用之前)
        // 这里可以进行一些预处理,比如权限检查、日志记录等
        System.out.println("====== MyInterceptor.preHandle ======");
        // 返回true继续流程(如调用下一个拦截器或处理器);返回false则中断流程,通常需要通过response来响应
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 请求处理之后调用,但在视图渲染之前(Controller方法调用之后)
        // 这里可以对模型数据进行处理或对视图进行修改
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 整个请求结束后调用,在DispatcherServlet渲染视图之后执行(通常用于资源清理)
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

关键方法解析:

  1. preHandle:

    • 该方法在请求被处理之前调用(在Controller方法执行之前)。通常用于做权限检查、数据验证、日志记录等。
    • 返回值:
      • true:表示继续处理该请求(执行下一个拦截器或最终的处理器)。
      • false:表示中断请求,通常会在此方法中通过response对象直接返回响应。
    • 示例场景:
      • 检查用户是否已登录。
      • 验证请求参数的合法性。
  2. postHandle:

    • 该方法在Controller方法执行之后,但在视图渲染之前调用。可以用于对请求处理结果进行进一步加工或修改。
    • 示例场景:
      • 在返回结果之前动态添加或修改数据。
      • 调整视图解析逻辑或修改响应头。
  3. afterCompletion:

    • 该方法在整个请求结束之后调用(在视图渲染完成之后)。常用于资源清理、日志记录等操作。
    • 示例场景:
      • 记录请求处理的最终状态(成功或失败)。
      • 释放数据库连接、关闭文件等资源。

# 3. 拦截器的测试

为了验证拦截器的工作,我们可以创建简单的Controller,并测试不同路径的请求:

@RestController
public class TestController {

    @GetMapping("/test3")
    public String test3() {
        return "This is test3 endpoint";
    }

    @GetMapping("/test4")
    public String test4() {
        return "This is test4 endpoint";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

请求示例:

  1. 测试路径/test3:

    • URL: http://localhost:8080/test3
    • 控制台输出:
    ====== MyInterceptor.preHandle ======
    
    1
    • 返回结果:This is test3 endpoint

    说明:/test3路径被拦截器拦截,成功输出日志。

  2. 测试路径/test4:

    • URL: http://localhost:8080/test4
    • 控制台无拦截器日志输出。
    • 返回结果:This is test4 endpoint

    说明:/test4路径未被拦截器拦截,直接返回响应。

# 4. 适用场景

拦截器是一个灵活且强大的工具,适用于以下场景:

  • 全局日志记录:记录每个请求的进出时间、处理时间、请求参数等。
  • 权限校验:在请求进入Controller之前,检查用户是否具备访问权限。
  • 通用数据处理:在请求处理前或返回结果前,处理一些通用逻辑,如添加公共响应数据。

# 5. 注意事项

  • 拦截器的注册顺序很重要,Spring MVC会按照注册的顺序依次执行拦截器。
  • 使用excludePathPatterns可以精确排除不需要拦截的路径,例如登录、注册接口等。

# 6. 拦截器与过滤器的区别

  • 拦截器(Interceptor):基于Spring MVC,作用于Controller层,可以访问Spring容器中的Bean。
  • 过滤器(Filter):基于Servlet规范,作用范围更广,可以在整个请求生命周期中工作(包括静态资源、所有请求)。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
Spring MVC 自定义格式化器
SpringMVC 配置跨域(CORS)

← Spring MVC 自定义格式化器 SpringMVC 配置跨域(CORS)→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式