分享

Spring 3.2 MVC拦截器实例详解:入门

 I_T_馆 2014-05-20

项目DEMO下载地址:twovv-test-spring-interceptor.rar

入门:

1、Spring拦截器的作用:

重点:拦截约等于临时阻断正常的方法执行流程。

1.1、概念:提供在不侵入原方法代码的情况下,通过拦截方法执行来达到执行其他方法或事情的目的(纯个人理解,非官方言论)。

1.2、Action方法执行前预处理,拦截并执行其他业务逻辑:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object interceptor) throws Exception;

1.3、方法执行后生成视图之前(调用了Service方法并返回了ModelAndView,单页面还没有渲染这个时间),拦截并执行其他业务逻辑:

public void postHandle(HttpServletRequest request, HttpServletResponse response,Object interceptor, ModelAndView view) throws Exception;

1.4、方法执行后(此时页面已经渲染完毕了),拦截并执行其他业务逻辑:

public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object interceptor, Exception exception)throws Exception;

2、Spring拦截器的实现方式:

2.1、实现org.springframework.web.servlet.HandlerInterceptor接口。

2.2、继承org.springframework.web.servlet.handler.HandlerInterceptorAdapter抽象类。

2.3、实现org.springframework.web.context.request.WebRequestInterceptor接口。

2.4、继承org.springframework.web.servlet.handler.WebRequestHandlerInterceptorAdapter抽象类。


重要:HandlerInterceptor/HandlerInterceptorAdapter两者的主要区别是抽象类默认空实现了HandlerInterceptor接口,同时为preHandle()返回true,我一般直接实现HandlerInterceptor接口。

WebRequestInterceptor/HandlerInterceptor两者的主要区别是WebRequestInterceptor的preHandle无返回值,既无法终止拦截器链。

3、在Spring配置文件appInterceptor.xml中注册自定义的interceptor

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www./schema/beans"
xmlns:xsi="http://www./2001/XMLSchema-instance" xmlns:mvc="http://www./schema/mvc"
xmlns:context="http://www./schema/context" xmlns:tx="http://www./schema/tx"
xsi:schemaLocation="http://www./schema/beans http://www./schema/beans/spring-beans-3.1.xsd
http://www./schema/mvc http://www./schema/mvc/spring-mvc-3.1.xsd
http://www./schema/context http://www./schema/context/spring-context-3.1.xsd
http://www./schema/tx http://www./schema/tx/spring-tx-3.1.xsd">
        
<!-- 测试拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/test/interceptor.htm"/>
            <bean class="com.twovv.intercepter.MyImplementInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>
</beans>

3.1、Spring MVC并没有总的拦截器,不能对所有的请求进行前后拦截。Spring MVC的拦截器,是属于HandlerMapping级别的,可以有多个HandlerMapping,每个HandlerMapping可以有自己的拦截器。

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

拦截器执行时机:一个请求交给一个HandlerMapping时,这个HandlerMapping先找有没有处理器来处理这个请求,如何找到了,就执行拦截器,执行完拦截后,交给目标处理器。如果没有找到处理器,那么这个拦截器就不会被执行。

<mvc:interceptors>  
    <bean class="com.twovv.GlobalInteceptor" />  
</mvc:interceptors>

直接将bean配置到mvc:interceptors,将会应用到所有的HandlerMapping,达到伪全局拦截器的目的。

3.2、匹配URI拦截具体的HandleMapping

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/test/interceptor.htm"/>
    <bean class="com.twovv.intercepter.MyImplementInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

mvc:mapping path匹配规则详细记录:

3.2.1、path必须以/开头进行匹配,因为默认的是匹配URI。

3.2.2、path匹配目录使用**,如/**/代表匹配所有的一级目录。

3.2.3、path匹配文件使用*,如/**/*.htm代表匹配所有一级目录下的所有htm文件。

3.2.4、path可以匹配以指定文字开头或者结尾或者中间包含的URI,如:

/twov**/twov*.htm
/*wov*/two*.htm
/*wovv/*wovv.htm

3.3、直接将interceptor注册到HandlerMapping(我个人不推荐)

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

这样就必须手动注册HandlerMapping,不能再使用<mvc:annotation-driven />方式,

而且这种配置不够灵活,还是推荐前两种方式。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多