SpringMVC * 创建配置及执行顺序
作者:把苹果咬哭的测试笔记 发布时间:2023-06-06 20:41:16
SpringMVC * 介绍
springMVC 中的 * 用于拦截控制器方法的执行。
先创建出前置需要的一些条件:
<a th:href="@{/testInterceptor}" rel="external nofollow" >测试 * </a>
后端:
@Controller
public class TestController {
@RequestMapping("/testInterceptor")
public String testInterceptor() {
return "success";
}
}
一、创建 *
新建一个包 interceptors,在下面创建一个 * FirstInterceptor ,并且要实现 HandlerInterceptor 接口。
快捷键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/,发现页面空白,查看控制器日志看到有打印:
说明拦截成功。
看下上面重新的三个方法中,只有preHandle有返回值,是个布尔类型:false 表示拦截,true 表示放行。
修改上面preHandle的返回为 true,重新部署后再次访问首页,可以访问成功。
查看控制台打印输出,看到在渲染之前,前面2个方法执行了:preHandle、postHandle 。
在非常多的 Thymeleaf 渲染之后,最后一个 afterCompletion 也执行了。
现在继续点击首页里的新加的超链接,发现也会被拦截放行。
说明这种配置方式,会拦截所有的请求。
设置不需要拦截的请求
可以通过 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/:
可以正常打开首页,并且控制台也没有输出 * 里的内容:
现在继续访问 http://localhost:8080/springmvc/testInterceptor,
拦截了。
三、多个 * 的执行顺序
继续新建一个 * 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/,查看控制台打印输出。
可以发现,preHandle 方法执行的顺序是 FirstInterceptor->SecondInterceptor。其他 2 个方法则是顺序倒过来。
若每个 * 的 preHandle()都返回 true:
执行顺序跟配置里的顺序有关,在上面 * 里 firstInterceptor 就是在 secondInterceptor前面。
preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()`会按照配置的反序执行。
若某个 * 的preHandle()返回了false:
preHandle()返回false和它之前的 * 的preHandle()都会执行。
postHandle()都不执行。
返回false的 * 之前的 * 的afterComplation()会执行。
试一下,把 SecondInterceptor 中的preHandle()修改返回 false,再次请求下首页:
符合预期。
这些过程可以打断点看下源码的执行过程。
来源:https://blog.csdn.net/wessonlan/article/details/124812949


猜你喜欢
- 在 Android 加载图片一般使用 ImageView,这里简单记录一下这个控件的使用方法。最简单就是在 xml 里直接使用 ImageV
- 快速排序算法概念快速排序一般基于递归实现。其思路是这样的:1.选定一个合适的值(理想情况中值最好,但实现中一般使用数组第一个值),称为“枢轴
- 类的定义面向对象的程序设计中,类可以看作是我们自定义的数据类型,那么,如何能更加优美,更加高效地定义它就显得尤为重要。类中的成员有很多,每一
- 前段时间在写直播的时候,需要观众在看直播的时候点赞的效果,在此参照了腾讯大神写的点赞(飘心动画效果)。下面是效果图:1.自定义飘心动画的属性
- 开发前准备1、密钥工具在线工具地址:https://miniu.alipay.com/keytool/create无需下载,直接在线生成你的
- 摘要:其实两种方法归结起来看还是一种,都是利用Thread的构造器进行创建,区别就是一种是无参的,一种是有参的。一、继承Thread线程类:
- 项目代码:https://github.com/bruceq/supermarket项目结构:依赖关系:common:公共层,无依赖dao:
- 昨天遇到了点问题解决浪费了一些时间(导致更新内容较少)回顾下问题项目出现Unable to import maven project: Se
- 前言公司的邮件系统用的是 * 的 Lotus notes, 你敢信?最近要实现一个功能,邮件提醒功能,就是通过自动发送提醒邮件 前
- 上篇文章给大家介绍了在idea中将创建的java web项目部署到Tomcat中的过程图文详解,可以参考下,本文给大家继续介绍如何在IDEA
- 本文实例讲述了Android编程实现分页加载ListView功能。分享给大家供大家参考,具体如下:package eoe.listview;
- 有时候,我们使用AOP来进行放的增强,编写切面类的时候,需要定位在哪个方法上试用该切面进行增强,本片文章主要讲解两种在SpringBoot中
- 简介本文用示例介绍SpringBoot如何解决雪花算法主键ID传到前端后精度丢失问题。问题描述Java后端Long类型的范围-2^63~2^
- Spring AOP对嵌套方法不起作用今天在调研系统操作记录日志时,好多教程都是借助于Spring AOP机制来实现。于是也采用这种方法来实
- 本文实例为大家分享了Android列表时间轴展示的具体代码,供大家参考,具体内容如下实现的效果图如下:实现的方式是利用recycleview
- 本篇概览在检测人脸数量、位置、性别、口罩等场景时,可以考虑使用百度开放平台提供的web接口,一个web请求就能完成检测得到结果,本篇记录了从
- 最近在做一个项目,需要用到非对称加密,但是出现一个很诡异的情况,本地开发环境是Windows环境,测试环境是Linux环境,出现一个问题,
- 1 仿射变换仿射变换:一种二维坐标到二维坐标的线性变换,它保持二维图像的平直性与平行性,即变换后直线依然是直线,平行的线依然平行。packa
- 一 前言redis在分布式应用十分广泛,本篇文章也是互联网面试的重点内容,读者至少需要知道为什么需要分布式锁,分布式锁的实现原理,分布式锁的
- 本文实例讲述了C#获取机器码的方法。分享给大家供大家参考,具体如下:using System.Runtime.InteropServices