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注解来指定顺序。

相关推荐
我命由我123457 小时前
Java 并发编程 - Delay(Delayed 概述、Delayed 实现、Delayed 使用、Delay 缓存实现、Delayed 延迟获取数据实现)
java·开发语言·后端·缓存·java-ee·intellij-idea·intellij idea
北城以北88887 小时前
SSM--MyBatis框架之缓存
java·缓存·intellij-idea·mybatis
kyle~7 小时前
算法数学---差分数组(Difference Array)
java·开发语言·算法
曹朋羽7 小时前
Spring EL 表达式
java·spring·el表达式
沐浴露z7 小时前
详解JDK21新特性【虚拟线程】
java·开发语言·jvm
No0d1es8 小时前
电子学会青少年软件编程(C/C++)1级等级考试真题试卷(2025年9月)
java·c语言·c++·青少年编程·电子学会·真题·一级
我是天龙_绍8 小时前
java 比对两对象大小 重写 comparator
后端
IT_陈寒8 小时前
Python 3.12新特性实测:10个让你的代码提速30%的隐藏技巧 🚀
前端·人工智能·后端
BingoGo8 小时前
从零开始打造 Laravel 扩展包:开发、测试到发布完整指南
后端·php