【SpringMVC 从 0 开始】拦截器介绍

简介: 【SpringMVC 从 0 开始】拦截器介绍

springMVC 中的拦截器用于拦截控制器方法的执行。


先创建出前置需要的一些条件:


<a th:href="@{/testInterceptor}">测试拦截器</a>


后端:


@Controller
public class TestController {
    @RequestMapping("/testInterceptor")
    public String testInterceptor() {
        return "success";
    }
}


一、创建拦截器


新建一个包 interceptors,在下面创建一个拦截器 FirstInterceptor ,并且要实现 HandlerInterceptor 接口。


1268169-20210820185755430-466620365.png


快捷键Ctrl + O,快速重写方法,图示里的 3 个。


public class FirstInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("FirstInterceptor --> preHandle");
        return false;
    }
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("FirstInterceptor --> postHandle");
    }
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("FirstInterceptor --> afterCompletion");
    }
}


  • preHandle: 在当前控制器方法执行之前执行。
  • postHandle: 在当前控制器方法执行之后执行。
  • afterCompletion:处理完视图和模型数据,渲染视图完毕之后执行。


二、配置拦截器


在 springMVC 配置文件里配置拦截器,对象就是FirstInterceptor 类:


<!-- 配置拦截器 -->
  <mvc:interceptors>
      <bean class="com.pingguo.mvc.interceptors.FirstInterceptor"></bean>
  </mvc:interceptors>


重新部署,访问http://localhost:8080/springmvc/,发现页面空白,查看控制器日志看到有打印:


1268169-20210820191350032-1751827509.png


说明拦截成功。


看下上面重新的三个方法中,只有preHandle有返回值,是个布尔类型:false 表示拦截,true 表示放行。


修改上面preHandle的返回为 true,重新部署后再次访问首页,可以访问成功。


1268169-20210820192210665-1058407154.png


查看控制台打印输出,看到在渲染之前,前面2个方法执行了:preHandle、postHandle 。


1268169-20210820192407769-654622960.png


在非常多的 Thymeleaf 渲染之后,最后一个 afterCompletion 也执行了。


1268169-20210820192256771-1337362446.png


现在继续点击首页里的新加的超链接,发现也会被拦截放行。


1268169-20210820192656308-1420243739.png


说明这种配置方式,会拦截所有的请求。


设置不需要拦截的请求


可以通过 ref 或 bean 标签设置拦截器:


  • 通过mvc:mapping设置需要拦截的请求
  • 通过mvc:exclude-mapping设置需要排除的请求


<bean name="firstInterceptor" class="com.pingguo.mvc.interceptors.FirstInterceptor"></bean>
    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/"></mvc:exclude-mapping>
            <ref bean="firstInterceptor"></ref>
        </mvc:interceptor>
    </mvc:interceptors>


注意这里我在外部注册了一个 bean 叫 firstInterceptor,以便 ref 引用。


  • <mvc:mapping path="/**"/>,表示拦截所有请求。
  • <mvc:exclude-mapping path="/">,表示除了首页不拦截。


也就是说,现在我访问http://localhost:8080/springmvc/的时候,应该不拦截。


访问http://localhost:8080/springmvc/testInterceptor就会拦截了。


试一下,先访问 http://localhost:8080/springmvc/:


可以正常打开首页,并且控制台也没有输出拦截器里的内容:


1268169-20210820202949035-91427136.png


现在继续访问 http://localhost:8080/springmvc/testInterceptor,


1268169-20210820203154643-292822174.png


拦截了。


三、多个拦截器的执行顺序


继续新建一个拦截器SecondInterceptor,注意这次我加了 @Component,方便在配置文件中直接ref引用使用。


@Component
public class SecondInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("SecondInterceptor --> preHandle");
        return true;
    }
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("SecondInterceptor --> postHandle");
    }
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("SecondInterceptor --> afterCompletion");
    }
}


修改拦截器配置:


<!-- 配置拦截器 -->
    <mvc:interceptors>
        <ref bean="firstInterceptor"></ref>
        <ref bean="secondInterceptor"></ref>
    </mvc:interceptors>


重新部署,访问下首页http://localhost:8080/springmvc/,查看控制台打印输出。


1268169-20210821214654728-490411911.png


可以发现,preHandle 方法执行的顺序是 FirstInterceptor->SecondInterceptor。其他 2 个方法则是顺序倒过来。


若每个拦截器的 preHandle()都返回 true:


  • 执行顺序跟配置里的顺序有关,在上面拦截器里 firstInterceptor 就是在 secondInterceptor前面。
  • preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()`会按照配置的反序执行。


若某个拦截器的preHandle()返回了false:


  • preHandle()返回false和它之前的拦截器的preHandle()都会执行。
  • postHandle()都不执行。
  • 返回false的拦截器之前的拦截器的afterComplation()会执行。


试一下,把 SecondInterceptor 中的preHandle()修改返回 false,再次请求下首页:


1268169-20210821220759322-1712520142.png


符合预期。


这些过程可以打断点看下源码的执行过程。

相关文章
|
21天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9029 28
|
19天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
4004 16
|
19天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
2320 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
7天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
5天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
473 1
|
13天前
|
人工智能 Linux 开发者
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
Codex是OpenAI推出的AI编程智能体,可读取本地项目、理解需求并自动修改代码。支持桌面GUI、命令行(CLI)及VS Code/Cursor插件三种形态,覆盖可视化操作、终端高效开发与编辑器无缝集成场景,助开发者用自然语言驱动编码全流程。(239字)
1052 2
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
|
8天前
|
人工智能 Linux Windows
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面
千问办公(QwenWork)是阿里云推出的AI智能办公平台,支持网页端直接使用及Windows/Mac/Linux客户端下载。提供PPT生成、财报分析、网页搭建等AI功能,个人版免费,企业版198元/席/月。详情见官网qwenwork.cn或阿里云产品页。
1027 0
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面