SpringMVC第十阶段:HandlerInterceptor拦截器

news/2024/11/17 2:42:39/

HandlerInterceptor拦截器

1、HandlerInterceptor拦截器的介绍

在JavaWeb中,我们使用Filter过滤器对目标资源进行拦截操作.
在SpringMVC框架中,使用HandlerInterceptor来对访问的资源进行拦截操作.

HandlerInterceptor的使用和Filter非常接近,使用的步骤如下:

1、编写一个类去实现HandlerInterceptor接口
2、实现里面的方法
3、到SpringMVC的配置文件中,配置拦截器拦截哪些路径.

2、单个HandlerInterceptor拦截器的示例

1、编写一个类去实现HandlerInterceptor接口
2、到Spring的容器配置文件中去配置拦截器,让SpringMVC知道都拦截哪些目标方法

拦截器类:

public class FirstHandlerInterceptor implements HandlerInterceptor {/*** preHandle 是在目标资源之前执行  <br/>*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(" preHandle() 是在目标资源之前执行 ");// 它决定 是否 放行// return true;执行目标资源// return false; 不执行目标资源return true;}/*** postHandle 在目标资源之后执行 <br/>*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(" postHandle() 在目标资源之后执行 ");}/*** afterCompletion 在页面渲染完成之后执行*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(" afterCompletion() 在页面渲染完成之后执行 ");}
}

正常情况下, 拦截器代码执行顺序。

 preHandle() 是在目标资源之前执行 hello 方法被调用了 postHandle() 在目标资源之后执行 ok.jsp 页面渲染了***** afterCompletion() 在页面渲染完成之后执行 

在SpringMVC配置文件中配置:

<!--mvc:interceptors 是配置多个拦截器
-->
<mvc:interceptors><!--配置拦截器对象 , 它默认可以拦截全部请求<bean class="com.atguigu.interceptor.FirstHandlerInterceptor" />--><mvc:interceptor><!-- 拦截 /hello 请求 ( 设置拦截路径 )--><mvc:mapping path="/hello"/><!-- 拦截器类的全类名 --><bean class="com.atguigu.interceptor.FirstHandlerInterceptor" /></mvc:interceptor>
</mvc:interceptors>

3、单个拦截器异常时的执行顺序

一:目标方法前返回false的情况:

1、preHandler方法 								返回false
2、目标方法										不执行
3、postHandler方法								不执行
4、渲染的页面										不执行
5、afterCompletion页面渲染完成!				不执行

二:preHandler返回true的情况,目标方法异常

1、preHandler方法 								返回true
2、目标方法										异常
3、postHandler方法								不执行
4、渲染的页面										渲染异常页面
5、afterCompletion页面渲染完成!				执行

三:目标方法前返回true的情况,目标方法后异常

1、preHandler方法 								返回true
2、目标方法										执行
3、postHandler方法								产生异常
4、渲染的页面										渲染异常页面
5、afterCompletion页面渲染完成!				执行

四:目标方法前返回true的情况,渲染页面异常

1、preHandler方法 								返回true
2、目标方法										执行
3、postHandler方法								执行
4、渲染的页面										发生异常
5、afterCompletion页面渲染完成!				执行

4、多个拦截器的执行介绍:

public class SecondHandlerInterceptor implements HandlerInterceptor {/*** preHandle 是在目标资源之前执行  <br/>*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Second preHandle() 是在目标资源之前执行 ");// 它决定 是否 放行// return true;执行目标资源// return false; 不执行目标资源return true;}/*** postHandle 在目标资源之后执行 <br/>*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Second  postHandle() 在目标资源之后执行 ");}/*** afterCompletion 在页面渲染完成之后执行*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("Second  afterCompletion() 在页面渲染完成之后执行 ");}}多个拦截器的配置:<!--mvc:interceptors 是配置多个拦截器
-->
<mvc:interceptors><!--配置拦截器对象 , 它默认可以拦截全部请求<bean class="com.atguigu.interceptor.FirstHandlerInterceptor" />--><mvc:interceptor><!-- 拦截 /hello 请求 ( 设置拦截路径 )--><mvc:mapping path="/hello"/><!-- 拦截器类的全类名 --><bean class="com.atguigu.interceptor.FirstHandlerInterceptor" /></mvc:interceptor><!--配置一个拦截器--><mvc:interceptor><!-- 拦截 /hello 请求 ( 设置拦截路径 )--><mvc:mapping path="/hello"/><!-- 拦截器类的全类名 --><bean class="com.atguigu.interceptor.SecondHandlerInterceptor" /></mvc:interceptor>
</mvc:interceptors>

正常情况下, 多个HandlerInceptor的执行顺序和Filter差不多

First preHandle() 是在目标资源之前执行 
Second preHandle() 是在目标资源之前执行 hello 方法被调用了 
Second  postHandle() 在目标资源之后执行 
First postHandle() 在目标资源之后执行 ok.jsp 页面渲染了***** 
Second  afterCompletion() 在页面渲染完成之后执行 
First afterCompletion() 在页面渲染完成之后执行 

如果是在异常的情况下:
如果一个拦截器的前置方法preHandle()已经放行,则这个拦截器的页面渲染完成 afterCompletion() 一定执行


http://www.ppmy.cn/news/173588.html

相关文章

【手撕Spring源码】深度理解SpringMVC【上】

文章目录 DispatcherServletRequestMappingHandlerMappingRequestMappingHandlerAdapter自定义参数处理器自定义返回值处理器 参数解析器获取参数名对象绑定与类型转换底层第一套转换接口与实现底层第二套转换接口与实现高层转换接口与实现自定义转换器 ControllerAdvice 之 In…

电子模块|压力传感器模块HX711---C51STM32驱动

电子模块|压力传感器模块HX711---硬件介绍与C51&&STM32驱动 实物照片模块简介模块特点 软件驱动C51软件代码STM32软件代码 实物照片 模块简介 HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比&#xff0c;该芯片集成了包括稳压电源、…

php开发电脑配置表,电脑DIY配置清单有哪些?各个配置功能介绍

2015年的 组装电脑虽然没有往日的火爆&#xff0c;但是对于游戏玩家或者办公制图的用户来说&#xff0c;组装电脑是最具有性价比的&#xff0c;那么自己在家DIY电脑&#xff0c;需要购买的配置清单有哪些呢&#xff1f;下面小编就为大家汇总以及&#xff0c;另外再为大家介绍配…

组装台式计算机配置清单,diy之家 - 2017组装电脑配置清单_电脑diy主机配置推荐...

diy之家提供组装电脑配置清单及价格、学电脑知识与技巧,解决电脑故障的技能,让你爱上diy组装电脑 顶 发布 : diy之家 | 分类 : 装机教程 | 评论 : 0人 | 浏览 : 3824次 本教程会教你如何使用微软官方win10镜像重新安装系统,会讲解多种方法,第一部分会教您用最少的步骤安装稳…

计算机主机配置讲解,组装机电脑配置单讲解

组装机配置单都有哪些呢?之所以会有这么多人喜欢自己动手DIY电脑&#xff0c;最主要的原因高性价比就是重要原因之一&#xff0c;另外组装机的配件可以按照自己的需求来搭配&#xff0c;这也是DIY装机的精髓所在。接下来&#xff0c;我就来给大家分享一下组装机配置清单推荐。…

佛朗斯冲击港交所IPO:叉车租赁的未来是数字化?

佛朗斯“三战”IPO。 图源&#xff1a;佛朗斯 近日&#xff0c;广州佛朗斯股份有限公司&#xff08;下文简称为“佛朗斯”&#xff09;正式向港交所递交招股书&#xff0c;拟于港交所主板挂牌上市。 值得注意的是&#xff0c;这并不是佛朗斯首次冲击IPO。2019年6月和2020年7月…

传统的交叉熵函数如何通过平滑处理可以适用于多标签分类任务

传统的交叉熵损失函数通常用于多分类问题&#xff0c;而在多标签分类问题中&#xff0c;每个样本可能属于多个标签&#xff0c;因此需要使用一些新的技术来优化交叉熵损失函数。 一种常用的技术是标签平滑&#xff08;Label Smoothing&#xff09;&#xff0c;它可以优化传统的…

【Vue】三:Vue核心处理---vue的其它指令和自定义指令

文章目录 1.vue的其它指令1.1v-text 和 v-html1.2 v-cloak1.3 v-once1.4 v-pre 2. 自定义指令2.1 函数式2.2 对象式2.3.定义全局的指令 1.vue的其它指令 1.1v-text 和 v-html v-text&#xff1a;当做文件解析。 v-html&#xff1a;当做 HTML 代码解析。 1.2 v-cloak v-cloa…