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. Visual Studio编程效率提升技巧集(提高.NET编程效率)

    前言 本文大姚将为你介绍一些Visual Studio的使用技巧和建议,旨在帮助.NET开发者更加高效地利用Visual Studio进行编程工作.无论你是.NET初学者还是经验丰富的.NET开发者, ...

  2. 关于 CSDN 的恶臭嘴脸

    我有段时间确实希望通过 CSDN 增加我文章的阅读量.但是我怎么使用 CSDN,我想要的大概也就 cnblogs 相对符合预期,CSDN 真是垃圾. 为了钱真是什么都不要了,让我们这种没有自主经济来源 ...

  3. 算法学习笔记(30):Kruskal 重构树

    Kruskal 重构树 这是一种用于处理与最大/最小边权相关的一个数据结构. 其与 kruskal 做最小生成树的过程是类似的,我们考虑其过程: 按边权排序,利用并查集维护连通性,进行合并. 如果我们 ...

  4. 如何防止 Elasticsearch 服务 OOM ?

    ES 和传统关系型数据库有很多区别, 比如传统数据中普遍都有一个叫"最大连接数"的设置.目的是使数据库系统工作在可控的负载下,避免出现负载过高,资源耗尽,谁也无法登录的局面. 那 ...

  5. C#.NET WINFORM 缓存 System.Runtime.Caching MemoryCache

    C#.NET WINFORM 缓存 System.Runtime.Caching MemoryCache 工具类: using System; using System.Runtime.Caching ...

  6. mysql备份实战

    1.备份恢复演练(mysqldump+binlog) 知识储备 如下内容.. 全量备份 全量数据,指的是某一整个数据库(如kings)中所有的表.以及表数据,进行备份. 例如备份所有数据库.以及所有数 ...

  7. Vue学习:15.组件化开发

    组件化开发 组件化开发是一种软件开发方法,它将应用程序拆分成独立的.可重用的模块,每个模块都被称为组件.这些组件可以独立开发.测试.维护和部署,从而提高了代码的可维护性.可扩展性和复用性.在前端开发中 ...

  8. Xcode 配置账号

    Xcode 配置开发者账号 简介:在iOS 开发过程中,要打包到手机上是需要登陆账号和配置对应证书的. 配置账号 打开Xcode -> Preferences -> Accounts -& ...

  9. Blender练习——SciFi枪械.md

    Blender练习--SciFi枪械 一.基本操作 常用快捷键 E 挤出 B 倒角,中途可通过滚轮或S来调整细分 Alt+点选 循环选择 Ctrl Alt+点选 并排选择 F 补面,比如一个碗口,将碗 ...

  10. tar命令 --null -T 参数详解

    tar 命令的 --null 和 -T 参数可以一起使用,以从 null 设备读取文件名,并将这些文件名传递给 tar 命令来处理. --null 参数的作用是将文件名作为 null 字符分隔的字符串 ...