SpringMVC 中的 Interceptor 拦截器是非常重要和相当有用的,它的主要作用是拦截指定 的用户请求,

并进行相应的预处理与后处理。其拦截的时间点在“处理器映射器根据用户提 交的请求映射出了所要执行的处理器类,

并且也找到了要执行该处理器类的处理器适配器, 在处理器适配器执行处理器之前”。

当然,在处理器映射器映射出所要执行的处理器类时, 已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。

一个拦截器的执行

  1.自定义拦截器

 /*处理器执行链就是 处理器 加上这些拦截器,处理器执行链交给 中央调度器去处理*/
public class FirstInterceptor implements HandlerInterceptor { /*该方法在处理器方法执行之前执行, 其返回值 为 boolean,若为true,则紧接着会执行处理器方法,且会将 aferCompletion()方法 放入到一个专门的方法栈中等待执行*/
/*如果返回的 false,则 该拦截器 和 处理器之间的 联系就断了,就不会执行处理器的任何方法了,更别谈 postHandle 方法, aferCompletion()有可能执行,因为它是独立放在一个栈中*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行 FirstInterceptor 的 preHandle 方法!!!");
return true;
} /*该方法在处理器执行之后执行。处理器方法若最终未被执行,则该方法不会执行 。*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("执行 FirstInterceptor 的 postHandle 方法!!!"); } /*aferComletion 执行的前提:1.preHandle方法需要被执行 2.preHandle方法的返回值为 true*/
/*此时才会将该方法放到专门的方法栈中,等到对请求进行响应的所有工作完成之后才执行该方法 (即该方法是在中央调度器渲染(数据填充)页面之后,才执行)*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("执行 FirstInterceptor 的 afterCompletion 方法!!!"); } }

  自定义拦截器,需要实现 HandlerInterceptor 接口。而该接口中含有三个方法:

  preHandle(request, response, Object handler)该方法在处理器方法执行之前执行。其返回值为 boolean,

  若为 true,则紧接着会执行处理器方法,且会将 afterCompletion()方法放入到一个专门的方法栈中等待执行。

  postHandle(request, response, Object handler, modelAndView)该方法在处理器方法执行之后执行。

  处理器方法若最终未被执行,则该方法不会执行。由于该方法是在处理器方法执行完后执行,

  且该方法参数中包含    ModelAndView,所以该方法可以修改处理器方法的处理结果数据,且可以修改跳转方向。

  afterCompletion(request, response, Object handler, Exception ex)当 preHandle()方法返回 true 时,

  会将该方法放到专门的方法栈中,等到对请求进行响应的所有 工作完成之后才执行该方法。

  即该方法是在中央调度器渲染(数据填充)了响应页面之后执行的,此 时对 ModelAndView 再操作也对响应无济于事。

  拦截器中方法与处理器方法的执行顺序如下图:

  

  

  2.注册拦截器

 <mvc:interceptors>
<mvc:interceptor>
<!-- 指定注册的拦截器 可以拦截的路径请求 -->
<mvc:mapping path="/*"/>
<bean class="com.springmvc.interceptor.FirstInterceptor"/>
</mvc:interceptor>

多个拦截器的执行

/*当存在多个拦截器时,拦截器的方法调用顺序是 链式的 (1 2 3 2 1)*/

17.SpringMVC核心技术-拦截器的更多相关文章

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

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

  2. springmvc的拦截器

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

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

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

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

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

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

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

  6. SpringMVC 学习-拦截器 HandlerInterceptor 类

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

  7. springMVC的拦截器工作流程

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

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

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

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

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

随机推荐

  1. OpenStack Nova Release(Rocky to Train)

    目录 文章目录 目录 前言 演进方向 Cellv2 更新 Rocky Support disabling a cell Stein Handling a down cell Train Count q ...

  2. xcode报错: 找不到路径或者资源错误:no such file or directory

    报错截图: 出现的问题: 运行项目页面图片不显示. 解决方法: 1>[COMMAND+shift+G],前往文件夹,输入:  ~/Library/Developer/Xcode/DerivedD ...

  3. ubuntu kylin 18.04 使用 wine 安装 EasyConnect 的windows版本

    首先下载wine: sudo apt-get install wine-stable 然后使用wine安装安装包EXE文件(安装包你自己去下): wine EasyConnectInstaller.e ...

  4. Core Data概述(转)

    Core Data是一个模型层的技术.Core Data帮助你建立代表程序状态的模型层.Core Data也是一种持久化技术,它能将模型对象的状态持久化到磁盘,但它最重要的特点是:Core Data不 ...

  5. centos(linux)--vsftpd配置

    1.安装 执行 yum -y install vsftpd 注:(1)是否使用sudo权限根据个人的具体情况 (2)rpm -qa | grep vsftpd 可以通过这个检查是否已经安装vsftpd ...

  6. css常见双栏和三栏布局

    左侧固定右侧自适应 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  7. [转帖]密钥库文件格式(Keystore)和证书文件格式(Certificate)

    密钥库文件格式[keystore]代码 https://blog.csdn.net/zzhongcy/article/details/22755317 格式 : JKS 扩展名 : .jks/.ks ...

  8. mysql中的反引号``

    [1]反引号`,数字1左边的符号.tab键上面的符号. 它是为了区分MYSQL的保留字与普通字符而引入的符号. 不加反引号建的表不能包含MYSQL保留字,否则出错 如上图,很明显的,如果我们直接建立名 ...

  9. python的一些知识点

    1. 内置函数  iter 2. 可迭代对象与迭代器:

  10. Python解Leetcode: 226. Invert Binary Tree

    leetcode 226. Invert Binary Tree 倒置二叉树 思路:分别倒置左边和右边的结点,然后把根结点的左右指针分别指向右左倒置后返回的根结点. # Definition for ...