大数跨境
0
0

Spring 拦截器:你的请求休想逃过我的五指山!

Spring 拦截器:你的请求休想逃过我的五指山! 京东云开发者
2025-07-21
1
导读:拦截器概述在Spring框架中,拦截器(Interceptor)是一种强大的机制,它允许开发者在请求处理的不同

拦截器概述

在Spring框架中,拦截器(Interceptor)是一种强大的机制,它允许开发者在请求处理的不同阶段插入自定义逻辑。WebApplicationContext作为Spring Web应用的上下文容器,为拦截器的配置和管理提供了基础支持。

拦截器主要作用于以下场景:
权限验证
日志记录
性能监控
事务管理
通用行为注入等

拦截器与WebApplicationContext的关系

WebApplicationContext是Spring Web应用的IoC容器扩展,它继承自ApplicationContext,并添加了Web应用特有的功能。拦截器通过WebApplicationContext进行注册和管理,成为请求处理管道的一部分。

public interface WebApplicationContext extends ApplicationContext {    String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT";    ServletContext getServletContext();}

拦截器类型

HandlerInterceptor

最常用的拦截器接口,定义了三个关键方法:

public interface HandlerInterceptor {    default boolean preHandle(HttpServletRequest request,                              HttpServletResponse response,                              Object handler) throws Exception {        return true;    }    default void postHandle(HttpServletRequest request,                           HttpServletResponse response,                           Object handler,                          ModelAndView modelAndView) throws Exception {    }    default void afterCompletion(HttpServletRequest request,                                HttpServletResponse response,                                Object handler,                                Exception ex) throws Exception {    }}
AsyncHandlerInterceptor

HandlerInterceptor的扩展,增加了异步处理的支持。

WebRequestInterceptor

与HandlerInterceptor类似,但提供了更通用的WebRequest抽象,不依赖于Servlet API。

拦截器配置

Java配置方式@Configuration@EnableWebMvcpublic class WebConfig implements WebMvcConfigurer {    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(new LoggingInterceptor())                .addPathPatterns("/**")                .excludePathPatterns("/static/**");        registry.addInterceptor(new AuthInterceptor())                .addPathPatterns("/admin/**");    }}
注解方式
@Componentpublic class MyInterceptor implements HandlerInterceptor {    // 实现方法}@Configurationpublic class InterceptorConfig {    @Autowired    private MyInterceptor myInterceptor;    @Bean    public WebMvcConfigurer adapter() {        return new WebMvcConfigurer() {            @Override            public void addInterceptors(InterceptorRegistry registry) {                registry.addInterceptor(myInterceptor);            }        };    }}

拦截器执行流程

拦截器在DispatcherServlet的处理流程中扮演重要角色:

  • preHandle:在处理器执行前调用

返回true继续执行

返回false中断请求处理

  • postHandle:在处理器执行后,视图渲染前调用

可修改ModelAndView

  • afterCompletion:在完整请求完成后调用

适合资源清理

高级拦截器特性

拦截器顺序控制

可以通过order属性控制多个拦截器的执行顺序:

registry.addInterceptor(new InterceptorA()).order(1);registry.addInterceptor(new InterceptorB()).order(2)
路径匹配模式

支持Ant风格的路径模式:

1.匹配一个字符

2.匹配零个或多个字符

3.匹配零个或多个目录

异步请求处理

对于异步请求,afterConcurrentHandlingStarted方法会被调用而不是postHandle和afterCompletion。

拦截器与过滤器的区别

特性
拦截器(Interceptor)
过滤器(Filter)
容器依赖
Spring容器
Servlet容器
作用范围
Spring MVC处理的请求
所有进入容器的请求
访问对象
可以访问Handler和方法信息
只能访问ServletRequest/Response
执行时机
在DispatcherServlet内部执行
在DispatcherServlet外部执行
依赖注入
支持
不支持

实际应用示例

日志拦截器

public class LoggingInterceptor implements HandlerInterceptor {    private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);    @Override    public boolean preHandle(HttpServletRequest request,                            HttpServletResponse response,                            Object handler) {        long startTime = System.currentTimeMillis();        request.setAttribute("startTime", startTime);        logger.info("Request URL: {} : Start Time={}"                   request.getRequestURL(), startTime);        return true;    }    @Override    public void afterCompletion(HttpServletRequest request,                                HttpServletResponse response,                                Object handler,                                Exception ex) {        long startTime = (Long) request.getAttribute("startTime");        long endTime = System.currentTimeMillis();        logger.info("Request URL: {} : End Time={} : Time Taken={}ms"                   request.getRequestURL(), endTime, (endTime - startTime));    }}

认证拦截器

public class AuthInterceptor implements HandlerInterceptor {    @Override    public boolean preHandle(HttpServletRequest request,                            HttpServletResponse response,                            Object handler) throws Exception {        HttpSession session = request.getSession();        if (session.getAttribute("user") == null) {            response.sendRedirect("/login");            return false;        }        return true;    }}

DEMO实测效果

被拦截

未被拦截


扫一扫,加入技术交流群

【声明】内容源于网络
0
0
京东云开发者
京东云开发者(Developer of JD Technology)是京东科技集团旗下为AI、云计算、IoT等相关领域开发者提供技术分享交流的平台。平台将发布京东产品技术信息、行业技术内容、技术活动等资讯。拥抱技术,与开发者携手预见未来!
内容 1310
粉丝 0
京东云开发者 京东云开发者(Developer of JD Technology)是京东科技集团旗下为AI、云计算、IoT等相关领域开发者提供技术分享交流的平台。平台将发布京东产品技术信息、行业技术内容、技术活动等资讯。拥抱技术,与开发者携手预见未来!
总阅读43
粉丝0
内容1.3k