spring MVC攔截器

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   os   io   strong   

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屬性 注入攔截器了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.