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

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

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

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

一个拦截器的执行

  1.自定义拦截器

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

  自定义拦截器,需要实现 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.注册拦截器

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

多个拦截器的执行

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

转载于:https://www.cnblogs.com/xuzekun/p/7417345.html

17.SpringMVC核心技术-拦截器相关推荐

  1. SpringMVC——自定义拦截器、异常处理以及父子容器配置

    SpringMVC--自定义拦截器.异常处理以及父子容器配置 参考文章: (1)SpringMVC--自定义拦截器.异常处理以及父子容器配置 (2)https://www.cnblogs.com/so ...

  2. SpringMVC应用拦截器判断用户是否登录

    拦截器定义 实现HandlerInterceptor接口,实现接口方法. import javax.servlet.http.HttpServletRequest; import javax.serv ...

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

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

  4. SpringMVC自定义拦截器与异常处理(自定义异常)

    SpringMVC自定义拦截器与异常处理 拦截器概念 拦截器代码演示 创建maven工程 pom.xml <?xml version="1.0" encoding=" ...

  5. springMVC使用拦截器针对控制器方法做预处理、后处理、资源清理

    简单了解一下过滤器和拦截器: 过滤器是servlet规范中的一部分,任何java web工程都可以使用:在url-pattern中配置/*之后,可以对所有要访问的资源拦截.拦截器是springMVC框 ...

  6. springmvc高级(拦截器,全局异常处理,文件上传)

    SpringMVC 1.文件上传 文件上传: 指的就是将用户本地计算机中文件上传到服务器上的过程称之为文件上传 1).文件上传编程步骤 # 1.项目中引入相关依赖 <dependency> ...

  7. SpringMVC之拦截器使用

    拦截器的介绍 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理,可以通过自定义拦截器来实现特定的功能. 过滤器与拦截器的区别:拦截器是AO ...

  8. SpringMVC之拦截器

    目录 一.什么是拦截器? 二.拦截器与过滤器 三.应用场景 四.拦截器入门案例 五.拦截器方法说明 六.用户登录权限控制 一.什么是拦截器? SpringMVC的处理器拦截器,类似于Servlet开发 ...

  9. Marco's Java【SpringMVC入门(五) 之 SpringMVC的拦截器的使用】

    前言 我们知道在web开发中,一般有三大板块:Servlet(服务连接器) .Listener(监听器) 和Filter(过滤器),而今天我们要学习的拦截器可以算是一个精致的过滤器"法宝&q ...

最新文章

  1. 给同一个按钮添加单双击事件
  2. opengl里面的矩阵栈
  3. /root/.bashrc与/etc/profile的异同
  4. BMI指数与体重的关系
  5. vue jsx 使用 自定义组件
  6. unit类型是什么?_项目中有用过锁吗?能解释一下什么是AQS(AbstractQueuedSynchronizer)吗?...
  7. android之自定义广播
  8. 剑指Offer - 面试题3. 数组中重复的数字(哈希)
  9. 怎么判断软件公司是否靠谱
  10. 人工智能+人=强大的网络安全
  11. python绘制自定义地图_原来炫酷的可视化地图,用Python就能搞定!
  12. zuc算法代码详解_ZUC祖冲之序列密码算法
  13. dos下\与/有什么区别
  14. js msgbox 插件
  15. 如何解决audiodg占用内存高(停止与重启audiodg服务)
  16. 用node-webkit接入steamAPI
  17. (CRON) info (No MTA installed, discarding output)” error in the syslog
  18. 乐视手机恢复出厂设置后卡账户登录页面,刷入miui系统后妥妥的开发手机
  19. Greedy search与beam search
  20. 如何清空windows的系统剪贴板

热门文章

  1. 使用 TFDConnection 的 pooled 连接池
  2. MSSQL2005外网IP的1433端口开启方法
  3. 通过正则表达式查找一个模式的所有实例
  4. 一、Axis2 WebService开发准备工作
  5. FPGA中LVDS差分高速传输的实现
  6. php报错Permission denied
  7. 一个鼠标类( Using C# and Win32API)
  8. list控件响应鼠标键的单双击
  9. Win32 环境下的堆栈
  10. Brute Force算法介绍及C++实现