当前位置: 首页 > 编程日记 > 正文

17.SpringMVC核心技术-拦截器

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

相关文章:

Python培训讲解二叉树的三种深度

python代码实现了二叉树&#xff0c;这次将会实现二叉树的几种遍历方法&#xff0c;来更好的解析二叉树的结构特点。分别是一种广度遍历&#xff0c;和三种深度遍历方法&#xff1a;先序遍历&#xff0c;中序遍历&#xff0c;后序遍历。下面是代码实现&#xff1a; 1、先序遍历…

Ajax弹出漂亮可拖动的提示层(窗)效果

<html><head><meta http-equiv"Content-Type" content"text/html; charsetgb2312" /><title>Ajax提示框</title><style type"text/css">a{ color:#000; font-size:12px;text-decoration:none}a:hover{ colo…

技术图文:如何解决 DAO 抛出的 80040154 错误?

背景 前几天&#xff0c;咱们一起解决了向 Access 数据库插入大量数据效率底下的问题。通过实验表明&#xff1a;利用 DAO 的方式可以极大的提升数据插入速度。 如何利用 C# 向 Access 数据库插入大量数据&#xff1f; 可是&#xff0c;给电力局升级了软件产品之后&#xff…

路由器配置实践 教你如何在Linux中三台主机两个网段互相通信

大家好我是你们的齐天大圣又到了齐天大圣给大家讲解的时间了今天我带你们做一个 大大项目 你们信不信如果把你不小心打开这个文档 希望你能看完 这个博文花费了我两天的时间所以请尊重我的劳动 假装看完好吗 齐天大圣在此谢过各位看官首先欢迎大家观看操作步骤我们正式开始题目…

Web前端学习有哪些技巧?

想要学好web前端技术&#xff0c;在学习过程中找到合适的方法和技巧&#xff0c;那么在实际学习过程中会更加的容易和快速掌握知识重点&#xff0c;尤其是对于初学者尤为关键&#xff0c;下面小编就为大家详细的介绍一下Web前端学习有哪些技巧?希望能够对学习有所帮助。 Web前…

技术图文:如何利用C# + Echarts 绘制 Bar Simple?

背景 Echarts 是百度推出的一个使用 JavaScript 实现的开源可视化库。 该库提供了常规的折线图、柱状图、散点图、饼图、K线图&#xff0c;用于统计的盒形图&#xff0c;用于地理数据可视化的地图、热力图、线图&#xff0c;用于关系数据可视化的关系图、treemap、旭日图&…

Moss/Sharepoint 一些很重要的API备忘

1.根据用户名获取用户 SPUser user web.EnsureUser((new SPFieldLookupValue(item["Mitarbeiter"].ToString())).LookupValue); 2.根据guid获取Feature对象 SPFeature listDisplaySettingFeature site.Features[newGuid("88E9E47A-BA92-47ab-A253-8AA472CCC76B…

vue从创建到完整的饿了么(5)v-for,v-bind与计算属性

说明 1.上一章--Home.vue及vue-resource使用2.cangdu大神的项目源码地址--Github地址3.接口地址--Github地址4.UI框架用的是--Mint UI5.下一章--登录注册页面及密码的暗明文转换 开始 1.先看看Home.vue代码 <template><div><mt-header fixed><span slot&q…

python查询mysql中文乱码问题

相信很多在工作中的Python小伙伴&#xff0c;经常会遇到一些工作上的问题&#xff0c;例如查询mysql中文乱码问题&#xff0c;Python连接mysql数据库时&#xff0c;读取数据库中的中文出现乱码&#xff0c;所有中文都显示为问号了&#xff0c;那么该如何解决这个问题呢?解决问…

技术图文:如何利用C# + Echarts 绘制「堆叠条形图」?

背景 前几天&#xff0c;我们介绍了 如何利用C# Echarts 绘制 Bar Simple&#xff1f;&#xff0c;原以为把 Echarts 封装到这种程度就可以完成当前任务了。 可是&#xff0c;把软件原型提交给对方时&#xff0c;发现对方更希望“可视化设备发生缺陷的具体数据”。也即利用 堆…

Javascript原型链

这是关于原型链的一系列的现象与原理的解释以及例子 【转载请注明出处与地址】 分成4个部分阐述&#xff1a; 1.如何创建一个对象 2.使用原型链prototype实现对象的继承. 3.原型链上属性和方法的联系与规则 4.深入剖析原型链。 一、如何创建一个对象&#xff1a; 1.使用关键字n…

springbatch apache-activemq 整合(往mq中put数据,从mq中take数据)

简单测试如下&#xff1a;1&#xff1a;收下下载apache-activemq-5.14.4 解压apache-activemq-5.14.4\bin\win64&#xff0c;运行activemq.bat启动本地MQ服务器。通过浏览器可以查看本地MQ服务器的信息。http://127.0.0.1:8161/admin/index.jsp 2: 先往mq中put数据配置如下&…

什么是安全测试?哪些阶段需要安全测试?

安全测试是在IT软件产品的生命周期中&#xff0c;特别是产品开发基本完成到发布阶段&#xff0c;对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程&#xff0c;可以说&#xff0c;安全测试贯穿于软件的整个生命周期。下面通过一张图描述软件生命周期各个阶段的安…

技术图文:如何利用C#爬取CSDN的博客文章?

背景 大家有没有这样的体验&#xff0c;在 CSDN 上发现某个博主有很多干货文章&#xff0c;我们就想拿到这个博主以往文章的列表&#xff0c;在需要的时候进行查询和浏览。 如果从 CSDN 网站上用复制粘贴的方式来建立这个列表&#xff0c;一个是工作量很大&#xff0c;另一个…

SAP BADI应用

SAP BADI应用 1.定义BADI 1) T-Code: SE18 Business Add-In Define. 2) 输入要创建的BADI的名字&#xff0c;点击"Create"。 3) 输入BADI的描述性文本&#xff0c;在"Interface"选项卡上输入接口的名字&#xff0c;也可以采用SAP建议的接口的…

为什么多 TCP 连接比单 TCP 连接传输快

转自&#xff1a; 我观察到&#xff0c;客户端机器从单一服务器使用 HTTP 下载一个文件&#xff1a;1. 单连接下载&#xff0c;速度没有达到客户端网络的最大带宽&#xff1b;2. 多连接同时下载&#xff0c;传输速度有极大的提高&#xff0c;带宽被占满。假设如下前提&#xff…

学Python的好处有哪些?

Python是一种比较简单的编程语言技术&#xff0c;想要快速进入到IT行业&#xff0c;Python是非常好的选择&#xff0c;为什么这么说呢?下面小编就为大家详细的介绍一下学Python的好处有哪些? ​  学Python的好处有哪些? 1.如果你是一名新媒体相关人员&#xff0c;学习Pyth…

技术图文:如何利用C# 实现 Kruskal 最小生成树算法?

背景 以前我写过一些图文来介绍有关数据结构与算法的知识&#xff1a; 8大排序算法之&#xff1a;直接插入排序&#xff08;Straight Insertion Sort&#xff09;8大排序算法之&#xff1a;希尔插入排序&#xff08;Shell Insertion Sort&#xff09;8大排序算法之&#xff1…

又偷懒了4个月,督促自己

又偷懒了4个月 每天浑浑噩噩&#xff0c;做着无聊简单的体力活&#xff0c;我不应该是这个追求撒&#xff01;~~ 爸爸说的对&#xff0c;无论怎么样自己都要独立&#xff0c;要学习&#xff0c;爸爸希望我还去继续学习会计&#xff0c;我看下半年吧&#xff0c;各种学习都要&am…

java.lang.NoSuchMethodError: org.springframework.web.context.support.XmlWebApplicationContext.getEnv

转自&#xff1a;https://blog.csdn.net/u012941811/article/details/16960493 ava.lang.NoSuchMethodError: org.springframework.web.context.support.XmlWebApplicationContext.getEnvironment()Lorg/springframework/core/env/ConfigurableEnvironment; at 缺 org.springf…

零基础可以学好UI设计吗

随着UI设计行业的不断扩大发展&#xff0c;很多人都想要学习UI设计技术&#xff0c;但有很多同学都是零基础&#xff0c;想知道零基础可以学好UI设计吗?我们来看看下面的详细介绍就知道了。 零基础可以学好UI设计吗? 如果零基础自己学习UI设计着实有点吃力&#xff0c;毕竟对…

技术图文:如何利用C# 实现 Prim 最小生成树算法?

背景 我们上一篇图文介绍了 如何利用 C# 实现 Kruskal 最小生成树算法&#xff1f;&#xff0c;Kruskal 算法通过寻找边最优的方式来构造最小生成树&#xff0c;本篇图文介绍如何利用 C# 实现 Prim 最小生成树算法&#xff0c;Prim 算法通过寻找顶点最优的方式来构造最小生成树…

去除iphone图标的半弧高亮效果

只需要在info.plist里面添加一条记录UIPrerenderedIcon 新版的XCODE 会自动识别为Icon already includes gloss effects 打上勾就OK了 如果没有识别的右边栏写上YES就可以。转载于:https://www.cnblogs.com/jiewong/archive/2011/01/14/1935718.html

【短视频SDK - 参数解析】对焦模式、裁剪模式、视频质量、分辨率、视频比例、帧率、关键帧间隔等参数解析...

1.参数简析 参数名称简介影响裁剪模式分为填充模式和裁剪模式影响图像画面的展示细节视频质量是指生成的视频的输出参数&#xff0c;是一组参数决定的数值视频清晰度和文件大小分辨率图像分辨率则是单位英寸中所包含的像素点数&#xff0c;分辨率影响图像大小&#xff0c;与图像…

21年最新Python面试题及答案汇总详解(上)

错过三月找工作的机会&#xff0c;还要错过四月的好时期吗?Python面试你做准备了吗?下面小编整理了一套2021年最新Python常见面试题目&#xff0c;及Python面试题目答案汇总。希望能够帮助到大家。 21年最新Python面试题及答案汇总详解(上) 1、列表(list)和元组(tuple)有什么…

sina微博api源码阅读之函数

1. array_map将类的静态成员函数作为回调函数用在指定的单元上&#xff0c;可以递归调用 public static function urlencode_rfc3986($input) { if (is_array($input)) { return array_map(array(OAuthUtil, urlencode_rfc3986), $input); } else …

LeetCode实战:将有序数组转换为二叉搜索树

题目英文 Given an array where elements are sorted in ascending order, convert it to a height balanced BST. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by mo…

Spring、Spring Boot和TestNG测试指南 - @ActiveProfiles

Github地址 ActiveProfiles可以用来在测试的时候启用某些Profile的Bean。本章节的测试代码使用了下面的这个配置&#xff1a; Configuration public class Config {BeanProfile("dev")public Foo fooDev() {return new Foo("dev");}BeanProfile("prod…

python语言中如何使用注释

每一种计算机语言都有自己的注释方式&#xff0c;我们知道注释的作用是解释这些代码&#xff0c;方便程序员以后的检查和修改。而且注释的一部分在运行程序的过程中不起作用&#xff0c;也不会显示出来。下面我们将为大家介绍&#xff0c;在python语言中如何使用注释? 在pytho…

RHEL5(CentOS)下nginx+php+mysql+tomcat+memchached配置全过程(转)

RHEL5(CentOS)下nginxphpmysqltomcatmemchached配置全过程 一、准备工作&#xff1a; SSH,telnet终端中文显示乱码解决办法 vi /etc/sysconfig/i18n将内容改为 LANG"zh_CN.GB18030" LANGUAGE"zh_CN.GB18030:zh_CN.GB2312:zh_CN" SUPPORTED"zh_CN.GB18…