学习的博客:http://elf8848.iteye.com/blog/875830/

我项目中所用的版本:4.2.0。博客的时间比较早,11年的,学习的是Spring3 MVC。不知道版本上有没有变化比较大的功能。

spring mvc教程(三)拦截器

1.Spring中的拦截器

(1)拦截器接口

Spring提供了拦截器接口。实现这个接口或继承这个类,就能实现自己的拦截器。

1 org.springframework.web.servlet.HandlerInterceptor接口
2 org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器
1 public class MyInteceptor implements HandlerInterceptor {
2 //略
3 }

HandlerInteceptor有3个方法:分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)。

1 在preHandle中,可以进行编码、安全控制等处理;
2 在postHandle中,有机会修改ModelAndView;
3 在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。

参数中的Object handler是下一个拦截器。

1 //Action之前执行
2 public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler);
3
4 //生成视图之前执行
5 public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView);
6
7 //最后执行,可用于释放资源
8 public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)

(2)拦截器的执行过程

注意点:

 spring mvc 没有总的拦截器,即不能对所有的请求进行拦截。
spring mvc 的拦截器属于HandlerMapping级别。
可以有多个HandlerMapping,每个HandlerMapping可以有自己的拦截器。
HandlerMapping的执行顺序按照order值从小到大。

执行过程:当一个请求按Order值从小到大,顺序执行HandlerMapping接口的实现类时,哪一个先有返回,那就可以结束了,后面的HandlerMapping就不走了,本道工序就完成了。就转到下一道工序了。

 <!--没找到处理器,就不会执行拦截。-->
请求 --> HandlerMapping --> 寻找对应的处理器 --> 执行拦截器 --> 目标处理器

(3)拦截器的配置

方案1:(近似)总拦截器,拦截所有url

<mvc:interceptors/>会为每一个HandlerMapping,注入一个拦截器。总有一个HandlerMapping是可以找到处理器的,最多也只找到一个处理器,所以这个拦截器总会被执行的。起到了总拦截器的作用。

缺点:如果是REST风格的URL,静态资源也会被拦截。

 <mvc:interceptors>
<bean class="com.app.mvc.MyInteceptor" />
</mvc:interceptors>

方案2:(近似)总拦截器,拦截匹配url

只是比方案1多了一句 url 匹配。所以缺点也是同样的:如果是REST风格的URL,静态资源也会被拦截。

 <mvc:interceptors >
<mvc:interceptor>
<mvc:mapping path="/user/*" /> <!-- /user/* -->
<bean class="com.mvc.MyInteceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>

方案3HandlerMapping上的拦截器

前面提过,如果配置了<mvc:annotation-driven />,spring会自动注册两个bean:DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter 。这种情况下,就无法配置在handlerMapping上的拦截器了。所以去掉<mvc:annotation-driven />,而是手工配置这两个bean,精确的指定拦截器。

 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
<bean class="com.mvc.MyInteceptor"></bean>
</list>
</property>
</bean>

2017.3.31 spring mvc教程(三)拦截器的更多相关文章

  1. 2017.3.31 spring mvc教程(八) <mvc:annotation-driven />所做的工作

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  2. 2017.3.31 spring mvc教程(六)转发、重定向、ajax请求

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  3. 2017.3.31 spring mvc教程(二)核心流程及配置详解

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  4. 2017.3.31 spring mvc教程(一)核心类与接口

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  5. 2017.3.31 spring mvc教程(七)多视图控制器

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  6. 2017.3.31 spring mvc教程(五)Action的单元测试

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  7. 2017.3.31 spring mvc教程(四)全局的异常处理

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  8. spring mvc中的拦截器小结 .

    在spring mvc中,拦截器其实比较简单了,下面简单小结并demo下. preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Control ...

  9. Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用

    一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的 而在Spring中,基于Filter这种方式可以实现Bean预处理.后处理. 比如注入FilterRegistrationBean,然后 ...

随机推荐

  1. Glibc说明

    Glibc glibc是gnu发布的libc库,也即c运行库.glibc是linux系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会倚赖于glibc.glibc除了封装linux操作 ...

  2. bzoj 3507 DP+哈希

    [Cqoi2014]通配符匹配 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 541  Solved: 235[Submit][Status][Dis ...

  3. BZOJ 2103/3302/2447 消防站 树的重心【DFS】【TreeDP】

    2103: Fire 消防站 Time Limit: 30 Sec  Memory Limit: 259 MBSubmit: 157  Solved: 116[Submit][Status][Disc ...

  4. DiskGenius

    DiskGenius是一款集磁盘分区管理与数据恢复功能于一身的工具软件.它即是一款功能强大.灵活易用的分区软件,同时也是一款技术高超.功能全面的数据恢复软件.它不仅具备与分区管理有关的几乎全部功能,支 ...

  5. Angular(三)

    一.使用Module(模块)组织依赖关系 模块提供了一种方法,可以用来组织应用中一块功能区域的依赖关系:同时还提供了一种机制,可以自动解析依赖关系(又叫做依赖注入).一般来说,我们把这些叫做依赖服务, ...

  6. Vijos P1007 绕钉子的长绳子

    绕钉子的长绳子 背景 平面上有N个圆柱形的大钉子,半径都为R,所有钉子组成一个凸多边形. 现在你要用一条绳子把这些钉子围起来,绳子直径忽略不计. 描述 求出绳子的长度 格式 输入格式 第1行两个数:整 ...

  7. bzoj 4765 普通计算姬 dfs序 + 分块

    题目链接 Description "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些.普通计算机能计算数列区间和,而普通计算姬能 ...

  8. JMM内存模型+volatile+synchronized+lock

    硬件内存模型: Java内存模型: 每个线程都有一个工作内存,线程只可以修改自己工作内存中的数据,然后再同步回主内存,主内存由多个内存共享. 下面 8 个操作都是原子的,不可再分的: 1)  lock ...

  9. 在vc6里头文件sys/timeb.h里struct timeb各变量的具体含义?

    timeb的定义:struct _timeb{         time_t time;          unsigned short millitm;          short timezon ...

  10. laravel按月/时间区间查询数据

    public function payRollList($time) { $member_phone = Session::get(phone'); $engineer = Engineer::get ...