zoukankan      html  css  js  c++  java
  • SpringMVC深入总结--Spring中的拦截器

    Spring为我们提供了:
    org.springframework.web.servlet.HandlerInterceptor接口,

    org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器,
    实现这个接口或继承此类,可以非常方便的实现自己的拦截器。

    有以下三个方法:

    Action之前执行:

    1 public boolean preHandle(HttpServletRequest request,   HttpServletResponse response, Object handler);
    生成视图之前执行

    1 public void postHandle(HttpServletRequest request,   HttpServletResponse response, Object handler,   ModelAndView modelAndView);
    最后执行,可用于释放资源

    1 public void afterCompletion(HttpServletRequest request,   HttpServletResponse response, Object handler, Exception ex)
    分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)
    在preHandle中,可以进行编码、安全控制等处理;
    在postHandle中,有机会修改ModelAndView;
    在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。
    参数中的Object handler是下一个拦截器。

    如何使用拦截器?

    自定义一个拦截器,要实现HandlerInterceptor接口:

    Java代码

    1
    2
    3 public class MyInteceptor implements HandlerInterceptor {          略。。。    }
    Spring MVC并没有总的拦截器,不能对所有的请求进行前后拦截。
    Spring MVC的拦截器,是属于HandlerMapping级别的,可以有多个HandlerMapping ,每个HandlerMapping可以有自己的拦截器。
    当一个请求按Order值从小到大,顺序执行HandlerMapping接口的实现类时,哪一个先有返回,那就可以结束了,后面的HandlerMapping就不走了,本道工序就完成了。就转到下一道工序了。
    拦截器会在什么时候执行呢? 一个请求交给一个HandlerMapping时,这个HandlerMapping先找有没有处理器来处理这个请求,如何找到了,就执行拦截器,执行完拦截后,交给目标处理器。
    如果没有找到处理器,那么这个拦截器就不会被执行。

    在spring MVC的配置文件中配置有三种方法:

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

    Java代码

    1
    2
    3 <mvc:interceptors>       <bean class="com.app.mvc.MyInteceptor" />   </mvc:interceptors>
    为什么叫“近似”,前面说了,Spring没有总的拦截器。

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

    方案二, (近似) 总拦截器, 拦截匹配的URL。

    Xml代码

    1
    2
    3
    4
    5
    6 <mvc:interceptors >       <mvc:interceptor>             <mvc:mapping path="/user/*" /> <!-- /user/*  -->            <bean class="com.mvc.MyInteceptor"></bean>         </mvc:interceptor>     </mvc:interceptors>
    就是比 方案一多了一个URL匹配。

    方案三,HandlerMappint上的拦截器

    Xml代码

    1
    2
    3
    4
    5
    6
    7 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">         <property name="interceptors">             <list>                 <bean class="com.mvc.MyInteceptor"></bean>            </list>         </property>        </bean>
    如果使用了<mvc:annotation-driven />, 它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。

    当然我们可以通过人工配置上面的两个Bean,不使用 <mvc:annotation-driven />,就可以 给interceptors属性 注入拦截器了。


    其实我也不建议使用<mvc:annotation-driven />,而建议手动写配置文件,来替代 <mvc:annotation-driven />,这就控制力就强了。

  • 相关阅读:
    jquery validate 自定义验证方法 日期验证
    转:前端控制器是邪恶的么?
    eclipse打开文件位置Open Explorer 插件
    Eclipse标准版安装J2EE
    短网址生成思路算法
    smarty模板执行原理
    Smarty 变量使用
    Php模板引擎Smarty安装和配置
    转:PHP分页技术的代码和示例
    黑板架构模式及其常见实现方式
  • 原文地址:https://www.cnblogs.com/iamconan/p/7383475.html
Copyright © 2011-2022 走看看