Spring 攔截器配置有如下三種 web
第一種 spring
<mvc:interceptors> <bean class="alex.tong.mvc.GlobalHandlerInterceptor" /> </mvc:interceptors>
第二種 mvc
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="alex.tong.mvc.interceptor.GlobalHandlerInterceptor" /> </mvc:interceptor> </mvc:interceptors>
第三種 對指定HandlerMapping加攔截器 app
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="interceptors"> <list> <bean class="alex.tong.mvc.interceptor.GlobalHandlerInterceptor" /> </list> </property> </bean>對比:
第1、二種配置是在全部UrlHandlerMapping.mappedInterceptors屬性注入所配置的攔截器, 從而打到全局攔截。 源碼分析
優勢:1.能夠模擬全局攔截器。2.能夠配置Url path pattern 性能
缺點:1.在於不能重複定義,你要是在某個jar包裏配置了一次以後在外面配置沒法生效的。2.對全部請求都進行攔截,從而性能的開銷和請求的判斷是不得不考慮的。因此只適合最終開發者使用,不適合作代碼封裝。 spa
第三種 對指定**handlerMapping 註冊配置攔截器 設計
優勢:攔截目標性強,適合作先後業務處理。 code
缺點:只能攔截所配handlerMapping配置的請求 xml
從spring源碼分析得出HandlerExecutionChain添加攔截器的順序是HandlerExecutionChain.interceptors->AbstractUrlHandlerMapping.mappedInterceptors->AbstractHandlerMapping.adaptedInterceptors 從而你們能夠在配置攔截器的時候加以考慮此順序。
攔截器配置所影響的直接屬性
第一,二種配置添加的是AbstractUrlHandlerMapping的adaptedInterceptors屬性
第三種配置 添加的是AbstractHandlerMapping 的interceptors屬性(Spring初始化此HandlerMapping時候從新配置給adaptedInterceptors屬性的。
擴展原則
Spring 最終是在DispatcherServlet.doDispatch 中按照HandlerExecutionChain.interceptorList的順序一一執行攔截器。因此可經過給HandlerExecutionChain.interceptors、AbstractUrlHandlerMapping.mappedInterceptors、AbstractHandlerMapping.adaptedInterceptors注入本身的攔截器來實現靈活多層的攔截器機制。
注意點:重寫Spring 的 AbstractUrlHandlerMapping的lookupHandler方法的話請返回的handler不等於null時必須 instanceof HandlerExecutionChain,要否則所配置的AbstractUrlHandlerMapping.mappedInterceptors攔截器沒法運行。由於此段實現中spring有段不合理的設計(滿是本人的見解)。
有空時會將攔截器擴展部分代碼貼出來……