Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringMVC-拦截器

SpringMVC-拦截器

原创
作者头像
程序员NEO
发布于 2023-10-01 12:12:01
发布于 2023-10-01 12:12:01
2180
举报

概述

Java 里的拦截器是动态拦截 action 调用的对象,可以对 Controller 中的方法执行之前与执行之后, 及页面显示完毕后, 执行指定的方法,自定义的拦截器必须实现 HandlerInterceptor 接口

方法介绍

preHandle

🛩在业务处理器处理请求之前被调用

postHandle

🚕在业务处理器处理完请求后被调用

afterCompletion

🏍在 DispatcherServlet 完全处理完请求后被调用

使用 SpringMVC 拦截器

拦截所有请求

创建一个类实现 HandlerInterceptor 接口详细内容如下

代码语言:java
AI代码解释
复制
/**
 * @author BNTang
 */
public class MyFirstInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("处理器方法执行之前调用 → preHandle");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("处理器方法执行之后调用 → postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("页面显示完毕之后调用 → afterCompletion");
    }
}

preHandle 返回值 true 代表放行 false 代表不放行就执行不了处理器方法

然后紧接着就是修改核心配置文件了,在配置文件当中添加 拦截器

代码语言:html
AI代码解释
复制
<mvc:interceptors>
    <!--设置自定义,拦截器,拦截所有请求-->
    <bean class="top.it6666.web.interceptor.MyFirstInterceptor"/>
</mvc:interceptors>

启动工程,访问工程中的某一个 Controller 查看效果如下

拦截指定请求

修改 SpringMVC 核心配置文件,配置一下需要拦截的指定请求,哪些请求不需要拦截

代码语言:html
AI代码解释
复制
<mvc:interceptors>
    <mvc:interceptor>
        <!--设置拦截哪些请求-->
        <mvc:mapping path="/local"/>
        <!--设置哪些请求不拦截-->
        <mvc:exclude-mapping path="/exception"/>
        <bean class="top.it6666.web.interceptor.MyFirstInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

启动工程,访问被拦截的接口效果如下

配置多个拦截器的执行顺序

在配置了多个拦截器它们的执行顺序是怎样的呢,首先先把 preHandle 方法的返回值都改为 tru 也就是放行,然后启动工程访问 local 接口,查看控制台的输出信息如下

结果发现,preHandle 是按顺序执行了,而其他的都是按照倒序执行的,至于为什么就要来看看源码了,源码分析如下, 多个拦截器都返回 true 的源码执行流程如下,首先来看一下 preHandlepostHandleafterCompletion 这三个方法的分别调用时机吧,还是一样的从 DispatcherServlet 开始,调用时机如下图

调用时机看完了之后,现在就一个一个来分析它内部的执行流程吧,先来看 applyPreHandle 先不看别的就看循环它是怎么循环的即可,该方法的循环为 ++,那么就说明了是按照顺序一个一个取出进行执行了

经过如上的图就可以得出 preHandle 为啥是按顺序执行的了,那么紧接着就来看 postHandle 为啥是倒序执行吧,postHandle 对应的源码方法为 applyPostHandle 进入代码内容发现该方法的循环为 那么这也就是为啥是倒序执行的原因了

废话不多说,最后一个直接上源码了,原理同上

如上都是返回 true 的情况,那么返回 false 的情况呢,如下,第一个拦截器返回 false 第二个拦截器返回 true 的执行流程如下

首先调用 applyPreHandle 的时候里面有四个拦截器其中有一个是 SpringMVC 弄的,另外的3个是我们自己弄的,当循环走到我们的倒数第二个拦截器的时候你会发现,它进入到了 triggerAfterCompletion 方法内部,那么为啥呢,就因为你在 preHandle 方法中返回了一个 false 然后非一下就成了 true 然后就条件成立进入了

那么 triggerAfterCompletion 方法内部主要做了什么呢,在进入 triggerAfterCompletion 方法之前 interceptorIndex 的索引角标为 1

而 i 却是等于了 2 进入 triggerAfterCompletion 方法内部,查看详细内容如下,一样的是取出所有的拦截器数组

不过这个循环你需要注意一下了,它进入这个方法的时候 interceptorIndex 是为 1 那么我们的拦截器已经不会再从拦截器数组中获取了这也就是为什么只是输出了一个 preHandle 的原因了

这个方法执行完毕之后在往回执行直接返回了一个 false 在往上又进行了非的逻辑运算符又成了 true 然后就直接结束了后面的都不会再执行了

如上是第一个拦截器返回 false 第二个拦截器返回 true 的情况的执行流程,那么第一个拦截器返回 true 第二个拦截器返回 false 的执行流程是怎样的呢,自行修改 true false, 我这里直接讲解源码流程

如上图的解释就是我们自定义的拦截器第一个返回的是 true 那么 preHandle 执行了,preHandle 返回的是 true 这个时候不会进入 triggerAfterCompletion 然后继续往下取,取角标为 3 的拦截器这个时候 preHandle 执行了打印了我们的内容,而这个时候 preHandle 返回的是 false 非一下成为了 true 会进入 triggerAfterCompletion 方法体中,这个时候你需要注意一个变量那么就是 interceptorIndex 这个值,在最后一个拦截器进入到 triggerAfterCompletion 方法体的时候 interceptorIndex 这个值为 22,那么这个时候又去拦截器数组倒序取,那么最后一个拦截器是不会取出的,只取了第一个,那么第一个的 afterCompletion 执行了也就是会打印我们在 afterCompletion 方法体中编写的内容

执行完毕返回 false 最外面的方法运用了非的逻辑运算符就成了 true 条件成立导致后面的就都不会在执行了

内部源码分析

还是一样的套路先从 DispatcherServlet 进入,查看 doDispatch

如上方框框出来的内容是代表,要应用拦截器,点击方法进入进去查看,进入之后的代码如下

如上的内容你就关注两个点,我方框框着的点即可,如果返回 false 到了之前的那个方法,非一下就成了 true 下面的内容就不在执行了

而返回 true 就不一样了,返回 true 下面的内容就还会继续执行

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringMVC拦截器:给你的应用增添色彩
嗨,亲爱的小伙伴们!欢迎来到这段关于SpringMVC拦截器的奇妙之旅。今天我们要一探究竟,深入挖掘拦截器的神秘面纱,看看它是如何在你的应用中悄然发挥作用的。别怕,我会用最通俗易懂的语言,一步一步带你走进这个充满色彩的世界。
繁依Fanyi
2024/01/17
1880
SpringMVC拦截器配置
拦截器顾名思义就是用于拦截访问请求的,我们可以在拦截器里对访问请求进行事先的处理,例如权限检查、记录日志、验证请求数据等等。说白了就是我们可以在请求到控制器之前对其进行一个处理。 拦截器基本上和过滤器是类似的,只不过拦截器提供的方法比较实用,参数也比较多,而且拦截器是受到spring容器的管理的。 实现拦截器很简单,只需要实现spring里的HandlerInterceptor接口并实现接口中的三个方法即可,如下示例: package org.zero01.test; import org.springfr
IT架构圈
2018/06/01
6330
【SSM – SpringMVC篇】09 SpringMVC拦截器Interceptor详解,多个拦截器的执行顺序,拦截器进行权限判断和日志记录,拦截器和过滤器的区别
Interceptor拦截器,是SpringMVC提供用来拦截发送给Controller层方法请求的拦截器。类似于filter 主要进行记录日志,判断用户是否登录,过滤权限(没有登录就跳转登录之类的)   拦截器和我们所学的过滤器是很相似的,只是范围不一样。
全栈程序员站长
2022/09/16
6830
【SSM – SpringMVC篇】09 SpringMVC拦截器Interceptor详解,多个拦截器的执行顺序,拦截器进行权限判断和日志记录,拦截器和过滤器的区别
快速学习-拦截器
第10章 拦截器 10.1 自定义拦截器概述 Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器可以实现HandlerInterceptor接口,或者可以继承 HandlerInterceptorAdapter 适配器类 ① preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果
cwl_java
2020/02/19
6690
快速学习-拦截器
Spring 详解(三)------- SpringMVC拦截器使用
在实际应用中,咱们一般都是通过实现 HandlerInterceptor 接口或者继承 HandlerInterceptorAdapter 抽象类,复写 preHandle()、postHandle() 和 afterCompletion()这 3 个方法来对用户的请求进行拦截处理的。
海向
2019/09/23
5690
SpringMVC拦截器
拦截器(Interceptor)是 Spring MVC 框架提供的一种处理器。它是在请求到达控制器之前或者返回视图之前执行的一段代码逻辑。拦截器可以用来实现一些通用的功能,例如:日志记录、权限验证、国际化等等。
堕落飞鸟
2023/05/14
2030
【愚公系列】2023年04月 Java教学课程 140-Spring MVC框架的拦截器
---- 一、拦截器 1.拦截器概念 请求处理过程解析 拦截器( Interceptor)是一种动态拦截方法调用的机制 作用: 在指定的方法调用前后执行预先设定后的的代码 阻止原始方法的执行 核心原理: AOP思想 拦截器链:多个拦截器按照一定的顺序,对原始被调用功能进行增强 拦截器VS过滤器 归属不同: Filter属于Servlet技术, Interceptor属于SpringMVC技术 拦截内容不同: Filter对所有访问进行增强, Interceptor仅针对
愚公搬代码
2023/04/21
1410
【愚公系列】2023年04月 Java教学课程 140-Spring MVC框架的拦截器
SpringMvc—拦截器「建议收藏」
拦截器是用来拦截经过dispatcherServlet【请求控制器】的请求。它用来拦截控制器方法的执行。
全栈程序员站长
2022/09/07
6010
SpringMvc—拦截器「建议收藏」
springmvc的拦截器
作用: Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 用户可以自己定义一些拦截器来实现特定的功能。 拦截器和过滤器的区别: 过滤器是 servlet 规范中的一部分,任何 java web 工程都可以使用。 拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。 过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。 拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦 截的。 它也是 AOP 思想的具体应用。 我们要想自定义拦截器, 要求必须实现:HandlerInterceptor 接口。 编写jsp
暴躁的程序猿
2022/03/23
2760
springmvc的拦截器
使用springmvc的拦截器应用
Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理。
sunonzj
2022/06/21
4270
使用springmvc的拦截器应用
SpringMVC拦截器
Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
楠羽
2023/10/17
2280
SpringMVC拦截器
SpringMVC 拦截器的使用「建议收藏」
可以定义拦截器链,连接器链就是将拦截器按着顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
全栈程序员站长
2022/11/17
2940
SpringMVC 拦截器的使用「建议收藏」
SpringBoot拦截器和动态代理有什么区别?
在 Spring Boot 中,拦截器和动态代理都是用来实现功能增强的,所以在很多时候,有人会认为拦截器的底层是通过动态代理实现的,所以本文就来盘点一下他们两的区别,以及拦截器的底层实现。
磊哥
2023/09/15
3940
面试官:兄弟,讲一下责任链模式
各位java技术爱好者,我们又见面了! 之前我在面试的时候被问到责任链模式的问题,当时答不上来。这件事就一直在我心里耿耿于怀。相信很多人面试完都有这种体验,哈哈~ 不过今日不同往日了,现在我已经搞懂了,其实并不是很难,给大家分享一下。
java技术爱好者
2020/09/22
2920
面试官:兄弟,讲一下责任链模式
Springboot拦截器使用及其底层源码剖析
博主最近看了一下公司刚刚开发的微服务,准备入手从基本的过滤器以及拦截器开始剖析,以及在帮同学们分析一下上次的jetty过滤器源码与本次Springboot中tomcat中过滤器的区别。正题开始,拦截器顾名思义是进行拦截请求的一系列操作。先给大家示例一下使用操作
努力的小雨
2024/06/25
2210
SpringBoot拦截器及源码分析
java里的拦截器(Interceptor)是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前进行拦截,然后再之前或者之后加入某些操作。
秃头哥编程
2021/08/05
6660
SpringMVC拦截器
mvc:mapping是你要映射的拦截路径 可以有多个 mvc:exclude-mapping 是你排除映射的拦截路径,也可以有多个 下面那个bean 就是你自定义的拦截器了
試毅-思伟
2018/09/06
8490
SpringMVC拦截器
SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。
星哥玩云
2022/09/15
6820
SpringMVC拦截器
一篇文章让你弄懂SpringMVC 拦截器
第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口
Java编程指南
2019/08/02
8380
一篇文章让你弄懂SpringMVC 拦截器
快速学习-SpringMVC 中的拦截器
Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。用户可以自己定义一些拦截器来实现特定的功能。
cwl_java
2020/04/08
5250
相关推荐
SpringMVC拦截器:给你的应用增添色彩
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档