SpringMVC的攔截器:
1.首先我們需要引入jar包,這就不用說了,
定義自己的攔截器實現HandlerInterceptor,進行方法的重寫。
2.配置web.xml
<!--中央調度器--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <!-- TOmcat啟動的時候,Servlet對象就存儲到內存 正整數 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
3.配置一個處理器controller
4.定義大配置applicationContext.xml
<!-- 包掃描器 --> <context:component-scan base-package="cn.hq.controller"></context:component-scan> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="cn.hq.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
注意:現在攔截器的方法里第一個方法的返回值為false
效果演示:
請求后我們會發現控制台輸出一個字段
正是因為我們設置了它的返回值類型,故請求打道回府,黯然收場,他需要我們來解封他。
當把他解封后(true),再次請求:
再附上一張圖:
方法解析:
第一個方法preHandle尤其重要,他可以根據返回值
改變請求往下的流程,起着先導作用,第二個方法posHandle,他可以在
請求通過處理器后,緊接着做一系列的操作,最后經過最后一個方法
afterCompletion,進行客戶端的響應。
多個攔截器的配置:
<!-- 定義多個攔截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="cn.hq.interceptor.MyInterceptor2"></bean> </mvc:interceptor> </mvc:interceptors>
測試步驟,多配置一個攔截器
測試案例1,開啟第一道攔截器,改為true,第二道攔截器進行false,查看請求流程:
多個攔截器請求流程圖:
解釋:結合上述圖所示,他經過第一道攔截器時,通道開放,往下繼續走,當他走到第二道攔截時,發現通道關閉了,
但還是走了二道通道的第一方法,完了請求在這停止,無法通過處理器,但是第一道攔截器已經開啟了其通道,
故走了最終響應的afterCompletion方法。
測試案例2,開啟第一道攔截器,改為false,第二道攔截器進行true,查看請求流程:
解釋:根據流程圖,走完第一個方法后,停止前進。
測試案例3,兩道通道全部打開,查看請求流程:
生活有時就是如此,它在關上你一扇門之前,定會為你開啟另外一扇,只是在這個過程中,我們需要經過重重考驗,才能通過通道,實現自己的目標。
----告誡自己