0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

京东云 ? 来源:jf_75140285 ? 作者:jf_75140285 ? 2025-07-26 11:25 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

拦截器概述

在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

拦截器配置

XML配置方式


    
    
    
    
    
        
        
    

Java配置方式

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoggingInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/static/**");
        
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/admin/**");
    }
}

注解方式

@Component
public class MyInterceptor implements HandlerInterceptor {
    // 实现方法
}

@Configuration
public 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风格的路径模式:

? 匹配一个字符

匹配零个或多个字符

** 匹配零个或多个目录

异步请求处理

对于异步请求,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实测效果

被拦截

image.png

未被拦截

image.png
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web
    Web
    +关注

    关注

    2

    文章

    1289

    浏览量

    71614
  • 容器
    +关注

    关注

    0

    文章

    512

    浏览量

    22503
  • spring
    +关注

    关注

    0

    文章

    341

    浏览量

    15151
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    HarmonyOS实战开发-如何在Navigation中完成路由拦截

    路由拦截器interceptor.ets,定义拦截容器、注册方法和公共拦截逻辑,interceptor.ets /** * 定义拦截实现接口 * * @param routerI
    发表于 05-08 14:21

    什么是java spring

    的事情。然而,Spring的用途不仅限于服务端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring是一个容器,它包含并且管理系统对象
    发表于 09-11 11:16

    想做一个号码拦截器。面对面5米内接收到对方的手机号码。也咨询很多人,不是技

    想做一个号码拦截器。面对面5米内接收到对方的手机号码。也咨询很多人,不是技术问题就是,怕这东西触犯法律。只是正规用途,并不会触犯法律底线!望“能人”解决
    发表于 04-29 16:16

    五指山回收发那科驱动回收三菱变频回收秀洲CPU模块执行回收PLC

    `五指山回收发那科驱动回收三菱变频回收秀洲CPU模块执行回收PLC,长期专业回收西门子系列触摸屏,回收西门子人机界面,回收西门子扩展模块,回收西门子电源模块,回收西门子通讯模块,
    发表于 07-14 17:50

    网络组件axios可以在OpenHarmony上使用了

    分为两种:请求拦截器、响应拦截器。● 请求拦截器请求发送前进行必要操作处理,例如添加统一co
    发表于 08-29 12:11

    动能拦截器六自由度仿真建模研究

    仿真建模技术是动能拦截器制导律研究中的重要技术,文中主要建立动能拦截器的轨道运动动力学以及姿态运动动力学模型,并建立完整的制导控制系统数学模型。文末,以某型
    发表于 08-07 08:50 ?14次下载

    springmvc 自定义拦截器实现未登录用户的拦截

    springmvc自定义拦截器实现未登录用户的拦截
    发表于 11-25 14:44 ?2604次阅读
    springmvc 自定义<b class='flag-5'>拦截器</b>实现未登录用户的<b class='flag-5'>拦截</b>

    汽车库融融资监控“五指山

    ,使用了这个技术手段,如同有了如来佛祖的“五指山”,不用人为管理了,大幅节约成本,本质上彻底实现监管。智信通库融融资方案将逐步成为主流小编看着踌躇满志的智信通销售总经理,感叹:科技,只有科技支撑的公司,才可以有这样的底气。同时隐约感觉到智信通库融融资方案的潜力实在巨大。
    发表于 09-20 14:57 ?234次阅读

    小米的“五指山”意图击败余承东的华为终端+荣耀组合的宝具“双截龙”

    首先是小米的“五指山”,“ 小米将专注先进技术的率先导入”,问题是小米有先进技术吗?据小米官方消息,小米集团在2018年第一季度的研发费用为11.04亿元;2017年全年研发费用为31.51亿元
    的头像 发表于 01-28 16:01 ?3807次阅读

    五指刮擦试验仪测试方法的概述及优势介绍

    五指刮擦试验仪适用于行业: 五指刮擦试验仪用于各种汽车用内饰材料,如塑料、橡胶、皮革、织物、涂层材料、非涂层材料及其他复合材料等的耐刮擦性能检测。 多功能耐刮擦仪也称之为:耐刮擦试验机、耐刮擦测定仪
    发表于 07-27 11:26 ?2399次阅读

    Spring认证_什么是Spring GraphQL

    GraphQL 支持通过 HTTP 和 WebSocket 的 GraphQL 请求。 HTTP GraphQlHttpHandler 通过 HTTP 请求处理 GraphQL,并委托给 Web 拦截执行
    的头像 发表于 08-06 14:30 ?989次阅读
    <b class='flag-5'>Spring</b>认证_什么是<b class='flag-5'>Spring</b> GraphQL

    Spring中用到了哪些设计模式

    Spring 通过动态代理对类进行方法级别的切面增强,动态生成目标对象的代理类,并在代理类的方法中设置拦截器,通过执行拦截器中的逻辑增强了代理方法的功能,从而实现 AOP。
    发表于 05-30 09:43 ?399次阅读
    <b class='flag-5'>Spring</b>中用到了哪些设计模式

    Spring MVC的工作原理是怎样的

    的处理、视图的渲染和响应的发送。 首先,当用户在浏览中输入一个URL并发送请求时,请求被发送到服务。服务会根据
    的头像 发表于 11-22 16:53 ?1168次阅读

    springboot过滤器和拦截器哪个先执行

    Spring Boot是一个用于构建Java应用程序的开发框架,它提供了许多功能和工具来简化开发和部署过程。其中两个重要的功能是过滤器和拦截器。本文将详细介绍Spring Boot过滤器和拦截
    的头像 发表于 12-03 15:00 ?3070次阅读

    使用go语言实现一个grpc拦截器

    在开发grpc服务时,我们经常会遇到一些通用的需求,比如:日志、链路追踪、鉴权等。这些需求可以通过grpc拦截器来实现。本文使用go语言来实现一个 grpc一元模式(Unary)拦截器,上报链路追踪信息。
    的头像 发表于 12-18 10:13 ?979次阅读
    使用go语言实现一个grpc<b class='flag-5'>拦截器</b>