12.1、环境搭建

创建名为spring_mvc_interceptor的新module,过程参考9.1节和9.5节

12.1.1、页面请求示例

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

12.1.2、控制器方法示例

    @RequestMapping("/test/hello")
public String testHello(){
return "success";
}

12.2、拦截器的入门示例

12.2.1、创建拦截器

package online.liaojy.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* @author liaojy
* @date 2023/11/7 - 20:57
*/
// SpringMVC 中的拦截器要实现 HandlerInterceptor 接口
public class AAAInterceptor implements HandlerInterceptor { // preHandle()方法在控制器方法执行之前执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("AAAInterceptor-->preHandle()"); // 返回true表示不拦截,即执行控制器方法
// 返回false表示拦截,即不再执行控制器方法
return true;
} // postHandle()方法在控制器方法执行之后执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("AAAInterceptor-->postHandle()");
} // afterCompletion()方法在渲染完视图之后执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("AAAInterceptor-->afterCompletion()");
} }

12.2.2、配置拦截器

与自定义的过滤器一样,自定义的拦截器也要配置后才能生效;

过滤器是服务器中的组件,所以配置到 web.xml 中;

拦截器是 springmvc 中的组件,因此要配置到 springmvc 的配置文件中。

    <mvc:interceptors>
<bean class="online.liaojy.interceptor.AAAInterceptor"></bean>
</mvc:interceptors>

12.2.3、测试效果

因为在配置拦截器时,没有指定要拦截的路径,所以访问任何DispatcherServlet处理的资源时,拦截器都会执行。

12.3、拦截器的注解配置

除了使用 bean 标签通过全限定类名来配置拦截器,还可以通过 ref 标签引用已存在的 bean 组件来配置拦截器

12.3.1、将拦截器标识为bean组件

因为拦截器不属于持久层、业务层和控制层,所以应该用 @Component 注解将其标识为一个 bean 组件

@Component

12.3.2、通过ref标签引用配置拦截器

    <mvc:interceptors>
<ref bean="AAAInterceptor"></ref>
</mvc:interceptors>

12.4、拦截器的进阶示例

通过上述的方式来配置拦截器,会对 DispatcherServlet 所处理的所有请求都进行拦截;

在实际情况中,可能只需要拦截部分请求,或排除部分请求的拦截。

12.4.1、精确的拦截配置

    <mvc:interceptors>
<mvc:interceptor>
<!--通过mvc:mapping设置要拦截的请求,可以设置多个;用通配符时,/*表示只拦截一级路径的,/**才表示拦截任意的-->
<mvc:mapping path="/**"/>
<!--通过mvc:exclude-mapping设置要排除拦截的请求,可以设置多个 -->
<mvc:exclude-mapping path="/abc"/>
<!--设置实行精确拦截规则的拦截器-->
<bean class="online.liaojy.interceptor.AAAInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>

12.4.2、测试效果

如上图所示,拦截了一级路径的请求

如上图所示,拦截了二级路径的请求

如上图所示,没有拦截/abc的请求

注意:为实现演示效果,本例已在springmvc配置文件中设置了关于/abc请求的视图控制器

<mvc:view-controller path="/abc" view-name="success"></mvc:view-controller>

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

12.5.1、创建另一个拦截器

package online.liaojy.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* @author liaojy
* @date 2023/11/9 - 7:27
*/
public class BBBInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("BBBInterceptor-->preHandle()");
return true;
} public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("BBBInterceptor-->postHandle()");
} public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("BBBInterceptor-->afterCompletion()");
}
}

12.5.2、配置多个拦截器

    <mvc:interceptors>
<bean class="online.liaojy.interceptor.AAAInterceptor"></bean>
<bean class="online.liaojy.interceptor.BBBInterceptor"></bean>
</mvc:interceptors>

12.5.3、情况一

  • 如果每个拦截器的preHandle()都返回true

  • 此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关

  • preHandle()会按照配置的顺序执行,而postHandle()和afterCompletion()会按照配置的反序执行

注意:此时 AAAInterceptor 和 BBBInterceptor 拦截器的 preHandle() 方法返回值都是 true

12.5.4、情况二

  • 如果某个拦截器的preHandle()返回了false

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

  • 所有postHandle()都不执行

  • 返回false的拦截器之前的拦截器的afterCompletion()会执行

注意:此时 AAAInterceptor 拦截器的 preHandle() 方法返回值为true,而 BBBInterceptor 拦截器的为 false

12.5.5、执行顺序流程图

12.6、相关拓展

12.6.1、拦截器与过滤器的区别

  • 过滤器是 Tomcat 服务器中的对象,拦截器是 SpringMVC 框架中的对象;

  • 过滤器实现的是 Java 中的 Filter 接口,拦截器实现的是 SpringMVC 中的 HandleInterceptor 接口;

  • 过滤器配置在 web.xml 中,拦截器配置在 SpringMVC 配置文件中;

  • 过滤器在拦截器之前执行;

  • 过滤器是一个执行时间点;拦截器是三个执行时间点;

  • 过滤器除了对动态资源进行过滤之外,还可以对静态资源(HTML、CSS、JS、图片等)进行过滤;

  • 拦截器侧重对控制器方法进行拦截处理,如果一个请求不能被DispatcherServlet接收,那这个请求也不会被拦截器处理。

12.6.2、拦截器的应用场景

  • 权限校验:用户在访问某资源时,可以使用拦截器对用户请求进行拦截,

    判断当前用户有没有登录,如果没有登录则强制回到登录页面进行登录。

  • 性能监控:如果想统计用户访问某个控制器方法的时间,可以使用拦截器对控制器方法进行前置拦截和后置拦截,

    在前置拦截器里面记录用户访问资源的起始时间,在后置拦截器里面记录用户访问资源的结束时间,

    两个时间之差就是当前用户访问控制器方法是总时长。

  • 日志记录:记录请求资源的日志信息,比如请求方式、请求参数、请求响应等,都可以通过拦截器来实现信息记录。

12、SpringMVC之拦截器的更多相关文章

  1. 12.SpringMVC之拦截器

    1.拦截器概述 1.1 什么是拦截器? Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以 ...

  2. 基于注解风格的Spring-MVC的拦截器

    基于注解风格的Spring-MVC的拦截器 Spring-MVC如何使用拦截器,官方文档只给出了非注解风格的例子.那么基于注解风格如何使用拦截器呢? 基于注解基本上有2个可使用的定义类,分别是Defa ...

  3. SpringMVC—Struts2拦截器学习网址整理

    引自:http://blog.csdn.net/wp1603710463/article/details/49982683 SpringMVC—Struts2拦截器学习网址整理 最近项目中遇到权限相关 ...

  4. springmvc的拦截器

    什么是拦截器                                                         java里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使 ...

  5. SpringMVC利用拦截器防止SQL注入

    引言 随着互联网的发展,人们在享受互联网带来的便捷的服务的时候,也面临着个人的隐私泄漏的问题.小到一个拥有用户系统的小型论坛,大到各个大型的银行机构,互联网安全问题都显得格外重要.而这些网站的背后,则 ...

  6. SpringMVC经典系列-14自己定义SpringMVC的拦截器---【LinusZhu】

    注意:此文章是个人原创.希望有转载须要的朋友们标明文章出处.假设各位朋友们认为写的还好,就给个赞哈.你的鼓舞是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系linusz ...

  7. SpringMVC 学习-拦截器 HandlerInterceptor 类

    一.拦截器 HandlerInterceptor 类的作用 SpringMVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 二.怎么使用呢? 1. ...

  8. springMVC的拦截器工作流程

    首先,springmvc的拦截器配置在这就不多说了.主要讲一下拦截器的三个方法的执行顺序. preHandle方法一定是最先执行的方法,如果它返回为false下面的方法均不执行. postHandle ...

  9. 转 :关于springmvc使用拦截器

    原博客: http://elim.iteye.com/blog/1750680 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的 ...

  10. springmvc中拦截器与springmvc全局异常处理器的问题

    最近在做一个练手的小项目, 系统架构中用了springmvc的全局异常处理器, 做了系统的统一异常处理. 后来加入了springmvc的拦截器, 为了一些需求, 在拦截器中的 preHandle 方法 ...

随机推荐

  1. 【深度学习】c++部署onnx模型(Yolov5、PP-HumanSeg、GoogLeNet、UNet)

    这两天部署了好多模型,记录一下.代码链接. onnxruntime在第一张图的推理上比opencv快很多,但在后面的图上略微慢了一点. 不同的模型的部署时的输出不同,处理时需要对输出比较了解,下面分别 ...

  2. 记录nodejs做编辑和新增时候对数据库的操作

    server.js文件 const dao = require("../dao/user.dao"); saveDat是个对象自己处理一下 if (updataFlag) {//编 ...

  3. ES 关于 remote_cluster 的一记小坑

    最近有小伙伴找到我们说 Kibana 上添加不了 Remote Cluster,填完信息点 Save 直接跳回原界面了.具体页面,就和没添加前一样. 我们和小伙伴虽然隔着网线但还是进行了深入.详细的交 ...

  4. Bean Searcher v4.3.0 重大更新!

    往期阅读: 我这样写代码,比直接使用 MyBatis 效率提高了 100 倍 最近火起的 Bean Searcher 与 MyBatis Plus 倒底有啥区别? Bean Searcher v3.8 ...

  5. C# .NET core Avalonia 11.0版本,发布linux和MAC的简单记录

    .net core 7.0+centos 7.0 cetnos目前运行在hyper V虚拟机里 虚拟机部署的注意事项 1 需要配置网络环境, 确保在同一局域网下 如果sftp无法连接 ctrl+shi ...

  6. 【动手学深度学习】第三章笔记:线性回归、SoftMax 回归、交叉熵损失

    这章感觉没什么需要特别记住的东西,感觉忘了回来翻一翻代码就好. 3.1 线性回归 3.1.1 线性回归的基本元素 1. 线性模型 \(\boldsymbol{x}^{(i)}\) 是一个列向量,表示第 ...

  7. 高通Android UEFI中的LCD分析(2):关键的函数

    # 高通Android UEFI中的LCD分析(2):关键的函数 背景 在启动流程分析中,看到了几个经常出现的函数,这里实际分析一下有关的实现.以搞清楚高通做了什么,以及我们能做什么. 重要函数 MD ...

  8. 设备树DTS 学习:学习总结(应用篇)

    设备树DTS 学习:学习总结(应用篇) 背景 经过前几章的学习,我们可以说是掌握了设备树的基础用法,现在作为总结回顾. 1.设备树DTS 学习:有关概念 介绍了什么是设备树,设备树的作用,如何编译设备 ...

  9. 【Python】用Python把从mysql统计的结果数据转成表格形式的图片并推送到钉钉群

    ** python把数据转为图片 / python推送图片到钉钉群 ** 需求:通过python访问mysql数据库,统计业务相关数据.把统计的结果数据生成表格形式的图片并发送到钉钉群里. 一:Cen ...

  10. Spring Boot XML文件头

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...