首頁 > Java > java教程 > 詳細介紹Spring MVC攔截器

詳細介紹Spring MVC攔截器

巴扎黑
發布: 2017-09-08 09:43:36
原創
1379 人瀏覽過

Spring MVC的攔截器,是屬於HandlerMapping級別的,可以有多個HandlerMapping ,每個HandlerMapping可以有自己的攔截器,具體內容詳情大家透過本文學習吧

Spring為我們提供了:

org.springframework.web.servlet.HandlerInterceptor接口,
org.springframework.web.servlet.handler.HandlerInterceptorAdapter適配器,

實作此介面或繼承此類,可以非常方便的實現自己的攔截器。

有以下三個方法: 

#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是下一個攔截器。

如何使用攔截器?

自訂一個攔截器,要實作HandlerInterceptor介面:

Java程式碼 


public class MyInteceptor implements HandlerInterceptor {   
  略。。。 
}
登入後複製

Spring MVC並沒有總的攔截器,不能對所有的請求進行前後攔截。

Spring MVC的攔截器,是屬於HandlerMapping等級的,可以有多個HandlerMapping ,每個HandlerMapping可以有自己的攔截器。

當一個請求按Order值從小到大,順序執行HandlerMapping介面的實作類別時,哪一個先有返回,那就可以結束了,後面的HandlerMapping就不走了,本道工序就完成了。就轉到下一道工序了。

攔截器會在什麼時候執行呢? 一個請求交給一個HandlerMapping時,這個HandlerMapping先找有沒有處理器來處理這個請求,如何找到了,就執行攔截器,執行完攔截後,交給目標處理器。

如果沒有找到處理器,那麼這個攔截器就不會被執行。

在spring MVC的設定檔中配置有三種方法:

方案一,(近似)總攔截器,攔截所有url

Java程式碼  


  <mvc:interceptors> 
  <bean class="com.app.mvc.MyInteceptor" /> 
</mvc:interceptors>
登入後複製

為什麼叫「近似」,前面說了,Spring沒有總的攔截器。

<mvc:interceptors/>會為每一個HandlerMapping,注入一個攔截器。總有一個HandlerMapping是可以找到處理器的,最多也只找到一個處理器,所以這個攔截器總是會被執行的。起到了總攔截器的作用。

如果是REST風格的URL,靜態資源也會被攔截。

方案二, (近似) 總攔截器, 攔截符合的URL。

Xml程式碼  


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

就是比 方案一多了一個URL符合。

如果是REST風格的URL,靜態資源也會被攔截。

方案三,HandlerMappint上的攔截器。

如果是REST風格的URL,靜態資源就不會被攔截。因為我們精準的注入了攔截器。

Xml程式碼  


<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 />,這就控制力就強了。

如何取代 <mvc:annotation-driven />?他到底做了什麼工作?

一句 <mvc:annotation-driven />實際上做了以下工作:(不包括添加自己定義的攔截器)

我們了解這些之後,對Spring3 MVC的控制力就更強大了,想改哪就改哪裡。

Xml程式碼  


 <!-- 注解请求映射 --> 
  <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">     
  <property name="interceptors"> 
    <list>  
      <ref bean="logNDCInteceptor"/>  <!-- 日志拦截器,这是你自定义的拦截器 --> 
      <ref bean="myRequestHelperInteceptor"/>  <!-- RequestHelper拦截器,这是你自定义的拦截器-->  
      <ref bean="myPermissionsInteceptor"/> <!-- 权限拦截器,这是你自定义的拦截器-->  
      <ref bean="myUserInfoInteceptor"/> <!-- 用户信息拦截器,这是你自定义的拦截器-->  
    </list>     
  </property>     
</bean>   
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
  <property name="messageConverters">  
    <list>  
      <ref bean="byteArray_hmc" />  
      <ref bean="string_hmc" />  
      <ref bean="resource_hmc" />  
      <ref bean="source_hmc" />  
      <ref bean="xmlAwareForm_hmc" />  
      <ref bean="jaxb2RootElement_hmc" />  
      <ref bean="jackson_hmc" />  
    </list>  
  </property>  
</bean>  
<bean id="byteArray_hmc" class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /><!-- 处理.. --> 
<bean id="string_hmc" class="org.springframework.http.converter.StringHttpMessageConverter" /><!-- 处理.. --> 
<bean id="resource_hmc" class="org.springframework.http.converter.ResourceHttpMessageConverter" /><!-- 处理.. --> 
<bean id="source_hmc" class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /><!-- 处理.. --> 
<bean id="xmlAwareForm_hmc" class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" /><!-- 处理.. --> 
<bean id="jaxb2RootElement_hmc" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" /><!-- 处理.. --> 
<bean id="jackson_hmc" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /><!-- 处理json-->
登入後複製

以上是詳細介紹Spring MVC攔截器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板