Spring Boot使用拦截器(Interceptor)

文章目录


在Spring Boot中,拦截器(Interceptor)是另一种用于在请求被处理之前和之后执行代码的机制。与Servlet Filter相比,拦截器是Spring MVC框架的一部分,它提供了更细粒度的控制,特别是针对Spring MVC的Controller层。拦截器可以访问Spring的依赖注入(DI)功能,因此可以轻松地与Spring管理的bean进行交互。

定义拦截器

要定义一个拦截器,你需要实现HandlerInterceptor接口,该接口包含三个方法:preHandle、postHandle和afterCompletion。

preHandle :在Controller方法调用之前执行。如果返回false,则中断请求处理,不会继续调用后续的拦截器和Controller方法。
postHandle :在Controller方法调用之后,但在视图渲染之前执行(如果请求处理的结果是视图的话)。
afterCompletion:在整个请求处理完成之后执行,包括视图渲染和所有过滤器之后。主要用于资源清理工作。

注册拦截器

要注册拦截器,你需要实现WebMvcConfigurer接口(或继承WebMvcConfigurerAdapter类,但在Spring 5.0及更高版本中,WebMvcConfigurerAdapter已被标记为过时),并重写addInterceptors方法。

以下是一个简单的拦截器定义和注册的示例:

java 复制代码
import org.springframework.stereotype.Component;  
import org.springframework.web.servlet.HandlerInterceptor;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
@Component  
public class MyInterceptor implements HandlerInterceptor {  
  
    @Override  
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
        // 在Controller方法调用之前执行  
        // 可以进行权限检查、日志记录等  
        System.out.println("Before processing request");  
        return true; // 继续执行后续的拦截器和Controller方法  
    }  
  
    @Override  
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {  
        // 在Controller方法调用之后,视图渲染之前执行  
        // 可以修改ModelAndView  
        System.out.println("After processing request but before view rendering");  
    }  
  
    @Override  
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {  
        // 在整个请求处理完成之后执行  
        // 可以进行资源清理工作  
        System.out.println("After completion of request processing");  
    }  
}  
java 复制代码
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;  
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;  
  
@Configuration  
public class WebConfig implements WebMvcConfigurer {  
  
    @Autowired  
    private MyInterceptor myInterceptor;  
  
    @Override  
    public void addInterceptors(InterceptorRegistry registry) {  
        registry.addInterceptor(myInterceptor)  
                .addPathPatterns("/api/**") // 指定拦截的路径模式  
                .excludePathPatterns("/api/public/**"); // 排除不需要拦截的路径模式  
    }  
}

注意事项

拦截器可以访问Spring的依赖注入功能,因此可以轻松地与Spring管理的bean进行交互。

拦截器只适用于Spring MVC的Controller层,不适用于非Spring MVC的请求处理。

你可以通过addPathPatterns和excludePathPatterns方法来指定哪些路径应该被拦截或排除。

拦截器的执行顺序可以通过在InterceptorRegistry中添加拦截器时的顺序来控制。如果需要更细粒度的控制,可以考虑实现Ordered接口或使用@Order注解来指定顺序。

相关推荐
重生之后端学习1 分钟前
day08-Elasticsearch
后端·elasticsearch·spring cloud·中间件·全文检索·jenkins
东阳马生架构16 分钟前
订单初版—5.售后退货链路中的技术问题说明文档
java
小小寂寞的城21 分钟前
JAVA策略模式demo【设计模式系列】
java·设计模式·策略模式
志辉AI编程36 分钟前
别人还在入门,你已经精通!Claude Code进阶必备14招
后端·ai编程
JAVA学习通39 分钟前
图书管理系统(完结版)
java·开发语言
代码老y43 分钟前
Spring Boot项目中大文件上传的高级实践与性能优化
spring boot·后端·性能优化
abigalexy1 小时前
深入Java锁机制
java
paishishaba1 小时前
处理Web请求路径参数
java·开发语言·后端
神仙别闹1 小时前
基于Java+MySQL实现(Web)可扩展的程序在线评测系统
java·前端·mysql
程序无bug1 小时前
Java中的8中基本数据类型转换
java·后端