拦截器HandlerInterceptor | springmvc系列

拦截器.png
拦截器,通俗来来将,就是我们将访问某个路径的请求给拦截下来,然后可以对这个请求做一些操作

基本使用

创建拦截器类

让类实现HandlerInterceptor接口,重写接口中的三个方法。

@Component
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {@Override//原始方法调用前执行的内容public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle...");// true 放行,false 拦截return true;}@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...");}
}

配置拦截器类

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {@Autowiredprivate ProjectInterceptor projectInterceptor;// 这个方法是用来配置静态资源的,比如html,js,css等等@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");}// 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效@Overrideprotected void addInterceptors(InterceptorRegistry registry) {//配置拦截器registry.addInterceptor(projectInterceptor).addPathPatterns("/books" );//配置不拦截路径 .excludePathPatterns("/login");}
}

这里ProjectInterceptor拦截器也可以不注入,直接new一个该类

我们可以看到拦截器HandlerInterceptor的使用方法:

  • 首先编写拦截器HandlerInterceptor,来写出拦截后要执行的逻辑
  • 然后编写拦截器配置类,来 **注册拦截器 **,使之生效,并且可以配置需要 拦截的路径

三种拦截方式

  • 前置处理方法 - preHandle - 进入controller方法之前
  • 后置处理方法 - postHandle - 方法内部处理完成,页面渲染之前
  • 完成处理方法 - afterCompletion - 方法内部处理完成,页面渲染之前

这三个方法中,最常用的是 **preHandle **, 在这个方法中可以通过返回值来决定是否要进行放行,我们可以把业务逻辑放在该方法中,如果满足业务则返回true放行,不满足则返回false拦截。

接下来我们来具体看一下这三种拦截方式对应的函数

拦截器参数

前置处理方法

原始方法之前运行preHandle

public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {System.out.println("preHandle");return true;
}
  • request: 请求对象。使用request对象可以获取请求数据中的内容,如获取请求头的Content-Type
  • response: 响应对象
  • handler: 被调用的处理器对象,本质上是一个方法对象,对反射中的Method对象进行了再包装。使用handler参数,可以获取方法的相关信息(和反射中的class类一样)

后置处理方法

原始方法运行后运行,如果原始方法被拦截,则不执行

public void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView modelAndView) throws Exception {System.out.println("postHandle");
}

前三个参数和上面的是一致的。
modelAndView:如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整
因为咱们现在都是返回json数据,所以该参数的使用率不高。

完成处理方法

拦截器最后执行的方法,无论原始方法是否执行

public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) throws Exception {System.out.println("afterCompletion");
}

前三个参数与上面的是一致的。

ex:如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理
因为我们现在已经有全局异常处理器类,所以该参数的使用率也不高。

多个拦截器

写法

配置类和之前一样,只不过多注册了拦截器

@Configuration
@ComponentScan({"com.itheima.controller"})
@EnableWebMvc
//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {@Autowiredprivate ProjectInterceptor projectInterceptor;@Autowiredprivate ProjectInterceptor2 projectInterceptor2;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//配置多拦截器registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");}
}

执行顺序

拦截器执行的顺序是和配置顺序有关。就和前面所提到的运维人员进入机房的案例,先进后出。

  • 当配置多个拦截器时,形成拦截器链
  • 拦截器链的运行顺序参照拦截器添加顺序为准
  • 当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行
  • 当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作

多个拦截器.png

preHandle:与配置顺序相同,必定运行
postHandle:与配置顺序相反,可能不运行
afterCompletion:与配置顺序相反,可能不运行。
这个顺序不太好记,最终只需要把握住一个原则即可:以最终的运行结果为准

拦截器与过滤器

两者的区别

  1. 过滤器基于函数回调、拦截器基于反射;
  2. 过滤器几乎对所有请求起作用,拦截器只对目标执行方法起作用;
  3. 过滤器对请求进行预处理、再交给Servlet处理并且生成响应,最后Filter再对服务器响应进行后处理;拦截器可以在方法执行前调用(preHandle),方法执行后调用(postHandle),视图页面渲染后调用(afterCompletion)

如果大家有什么思考和问题,可以在评论区讨论,也可以私信我,很乐意为大家效劳。
好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/333242.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用GPT/GPT4完成AI绘图和论文写作?

详情点击链接:如何用GPT/GPT4完成AI绘图和论文写作? 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析,AI画图,图像识别,文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Clau…

数据结构与算法-栈-移掉K位数字

移掉K位数字 给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k **位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 示例 1 : 输入:num "1432219", k 3 输出:&quo…

Java面向对象综合练习(拼图小游戏),用java图形化界面实现拼图小游戏

1. 设计游戏的目的 锻炼逻辑思维能力利用Java的图形化界面,写一个项目,知道前面学习的知识点在实际开发中的应用场景 2. 游戏的最终效果呈现 Hello,各位同学大家好。今天,我们要写一个非常有意思的小游戏 —《拼图小游戏》 我们…

RabbitMQ(十一)队列的扩展属性(Arguments)

目录 一、简介二、队列扩展属性清单三、代码示例3.1 实现方式一:channel.queueDeclare()3.2 实现方式二:QueueBuilder.build() 一、简介 RabbitMQ 允许用户在声明队列、交换机或绑定时设置 扩展属性(Arguments),这些扩…

美区PayPal个人版注册绑VISA虚拟卡支付教程,贝宝预防风控日常消费付款技巧

很多人有国区PAYPAL,但是国区有非常多的限制,比如说很多美区商户不支持国区PAYPAL付款,这是最主要的区别,其他就是转账限制。 绑定PAYPAL这里我用的是Fomepay 4288卡段的卡 我们先来注册绑卡,首先你需要搭建一个支付…

PostgreSQL从入门到精通 - 第40讲:数据库不完全恢复

PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。 第40讲&#…

数据库基础2

一、基础数据类型 1、数值类型 2、字符串类型 3、时间类型 T就是一个完整的时间 4、数据类型转换 时间类型的计算函数 二、常用运算符 1、算术运算符 2、比较运算符 3、逻辑运算符

助推酒店产业智能化升级 I 喜尔康出席中国饭店协会成立三十周年总结展望大会

1月8日,中国饭店协会六届四次理事会暨中国饭店协会成立三十周年总结展望大会在广州隆重举办。 作为中国饭店协会理事单位及此次大会的赞助商,喜尔康受邀出席大会。现场,喜尔康集团董事长吴锡山发表了《智能家居 赋能后装修时代》的主题演讲&…

【Docker】可以将TA用于什么,简单了解下

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是是《Docker容器》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深…

ArcGIS中style文件的导入及lyr的文件的使用

地图是地理信息的重要载体,科学的配色方案可以有效地传递地理信息,而美观协调的配色方案也是我们进行地图符号化设计的重要内容。在日常工作中,我们常常苦恼于自带颜色不能满足需要或是希望使用现成的颜色模板,自定义配色方案导入…

SEO全自动发布外链工具源码系统:自动增加权重 附带完整的搭建安装教程

SEO全自动发布外链工具是一款基于PHP和MySQL开发的外链发布工具。它通过自动化流程,帮助站长快速、有效地发布外链,提高网站的权重和排名。该工具支持多种外链发布平台,如论坛、博客、分类信息等,可自定义发布内容和格式&#xff…

RT-Thread: CPU 使用率应用

关键词:RT-Thread cpu使用率,cpuusage.c , cpuusage.h 说明:使用 RT-Thread 希望知道 mcu 计算能力的使用率或cpu使用率。 注意:在调试CUP使用率时,根据参考资料移植了 cpuusage.c , cpuusage.h ,也调用了 void cpu_…