(十五)springMvc 攔截器
阿新 • • 發佈:2018-12-11
定義攔截器
springMvc
中定義攔截器只需要實現一個介面 org.springframework.web.servlet.HandlerInterceptor
;
public class Myfilter implements HandlerInterceptor {
...
}
介面中三個方法
/**
在執行 handler 之前,執行 進,進行攔截;
方法返回 true ,則放行;返回false,則攔截 ;
用途:身份認證,許可權管理
*/
@Override
public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return false;
}
/**
在執行handler之後,且在返回 modelAndView 之前執行
用途:為 modelAndView 填充一些統一的資料
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
在執行完 handler 之後(注意是執行完,不是執行),執行 ;
用途: 進行統一的異常處理 ;
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
配置攔截器
springMvc
的攔截器是針對 HandlerMapping
的,也就是一個 攔截器,對應一個 對映器 ,哪個對映器配置了攔截器,那麼只有經過該攔截器對映成功的 handler
才會被攔截 ;;
但是,也可以配置一個 類似 於全域性的攔截器,利用 springMvc
將一個攔截器,注入到每一個 對映器 中,就可以完成類似全域性攔截器 ;
-
配置單個對映器的攔截器
在
springMvc.xml
中進行配置 ;<!--自定義攔截器--> <bean class="xin.ijava.ssm.filter.Myfilter" id="myfilter" /> <!--配置單個攔截器--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <property name="interceptors"> <list> <ref bean="myfilter"/> </list> </property> </bean>
-
配置類似全域性的攔截器
可以配置多了攔截器,類似於攔截鏈的樣子,攔截順序按照定義的順序!
<!--配置類似全域性的攔截器--> <mvc:interceptors> <!--可以配置多個攔截器。按照配置的順序進行攔截--> <mvc:interceptor> <!--配置攔截的url , ** 代表攔截所有,包括子目錄--> <mvc:mapping path="/**"/> <bean class="xin.ijava.ssm.filter.Myfilter"/> </mvc:interceptor> <!--再配置一個攔截器--> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="xin.ijava.ssm.filter.Myfilter1"/> </mvc:interceptor> </mvc:interceptors>
多個攔截器的規則
這裡以 2
個攔截器為例子 ,A,B 兩個攔截器,A是第一個,B是第二個;
-
A、B 都放行
preHandle
按照攔截器的定義 順序執行,後兩個方法postHandle
,afterCompletion
,按照攔截器的定義順序 逆序執行 ; -
A放行,B不放行
preHandle
方法總是會執行,因為在裡面進行判斷是否放行 ;A攔截器放行,才會執行B攔截器,加強A 沒有放行,那麼後面的攔截器都不會得到執行;
只要有一個攔截器不放行,那麼所有的攔截器的
postHandle
都不會得到執行 ,但是其他放行的攔截器的afterCompletion
會得到執行 ; -
A,B都不放行
preHandle
方法總是會執行,因為在裡面進行判斷是否放行 ;由於A 沒有放行,那麼A後面的攔截器都不會得到執行了 ,就像一個鏈子一樣,在此斷掉了(攔截鏈);
綜合所述,對於統一日誌的處理,要放在第一位,並其要放行 ;