• spring MVC拦截器


    Spring为我们提供了:

    org.springframework.web.servlet.HandlerInterceptor接口,

    org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器,

    实现这个接口或继承此类,可以非常方便的实现自己的拦截器。

    例如:

    public class HelloWorldInterceptor implements HandlerInterceptor  {  
    @Override  
    public boolean preHandle(HttpServletRequest request,  
            HttpServletResponse response, Object handler) throws Exception {  
          
        System.out.println("Pre-handle");  
          
        return false;  
    }  
      
    @Override  
    public void postHandle(HttpServletRequest request,  
            HttpServletResponse response, Object handler,  
            ModelAndView modelAndView) throws Exception {  
        System.out.println("Post-handle");  
    }  
      
    @Override  
    public void afterCompletion(HttpServletRequest request,  
            HttpServletResponse response, Object handler, Exception ex)  
            throws Exception {  
        System.out.println("After completion handle");  
    }  

    有以下三个方法:

    Action之前执行:

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

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

     public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)
     
    分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面) 

    在preHandle中,可以进行编码、安全控制等处理; 

    在postHandle中,有机会修改ModelAndView; 

    在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。 

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

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

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

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

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

    方案二,  拦截匹配的URL。

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

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

    方案三,HandlerMappint上的拦截器。

    <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属性 注入拦截器了。

  • 相关阅读:
    ACM学习历程—Hihocoder 1288 Font Size(暴力 || 二分)
    ACM学习历程—HDU2476 String painter(动态规划)
    ACM学习历程—BestCoder Round #75
    ACM学习历程—Hihocoder [Offer收割]编程练习赛1
    codeforces 154A 贪心
    分治 最大连续和
    二分 连续上升子序列变形 UVA1471
    POJ3614 贪心+优先队列
    Havel-Hakimi定理 POJ1659
    拓扑排序
  • 原文地址:https://www.cnblogs.com/cxyj/p/3909122.html
Copyright © 2020-2023  润新知