自定義攔截器
Spring MVC也可以使用攔截器對請求進行攔截處理,用戶可以自定義攔截器來實現特定的功能,自定義的攔截器必 須實現HandlerInterceptor接口
1.自定義實現類實現 HandlerInterceptor接口
2.在springmvc配置文件中配置相對應的攔截器
<mvc:interceptors>
<!--配置自定義攔截器 ,所有的路徑都攔截 -->
<bean class="com.neuedu.springmvc.filter.MyFilter"></bean>
</mvc:interceptors>
– preHandle():該方法在目標方法之前被調用,
若返回值為true,則繼續調用后續的攔截器和目標方法
若返回值為false,則不會再調用后續的攔截器和目標方法
可以考慮做權限,日志或者事務等!
– postHandle():調用目標方法之后,但渲染視圖之前被調用
可以對請求域中的屬性或者視圖做出修改!
– afterCompletion():渲染視圖之后被調用,
可以在該方法中進行一些資源清理的操作。
關於攔截器的配置:
<mvc:interceptors>
<!--配置自定義攔截器 ,所有的路徑都攔截 -->
<bean class="com.neuedu.springmvc.filter.MyFilter"></bean>
<!-- 關於攔截器的配置問題 ,可以通過<mvc:interceptor>來配置使用哪個攔截器來【不】攔截的路徑-->
<mvc:interceptor>
<!-- 用<mvc:mapping>標簽指定要攔截的路徑 -->
<mvc:mapping path="/employ"/>
<!-- 指定使用哪個攔截器進行攔截 -->
<bean class="com.neuedu.springmvc.filter.SecondFilter"></bean>
</mvc:interceptor>
</mvc:interceptors>
通過運行結果與Debug模式看源碼可分析出
Filter
[1] Filter簡介
> Filter翻譯為中文是過濾器的意思。
> Filter是JavaWeb的三大web組件之一Servlet、Filter、Listener
> Filter的作用是在請求到達WEB資源(HTML、CSS、Servlet、JSP)之前進行攔截。
> Filter需要交給Tomcat訪問器來管理
> Filter的作用:
1.Filter可以在請求到達目標資源之前進行攔截
2.Filter也可以放行請求
3.Filter可以在響應到達瀏覽器之前做一個預處理
[2] Filter的HelloWorld
> 步驟:
1.創建一個類實現Filter接口
2.在web.xml文件中對Filter進行配置
<filter>
<filter-name>Filter的別名</filter-name>
<filter-class>Filter的全類名</filter-class>
</filter>
<filter-mapping>
<filter-name>別名</filter-name>
<url-pattern>需要Filter攔截的資源地址</url-pattern>
</filter-mapping>
[3] Filter的生命周期
> 一個請求的發送,到響應返回是一個線程。
> Filter的生命周期,指的是Filter對象由被創建到被銷毀的過程。
> Filter的生命周期方法:
- 構造器:Filter的構造器在服務器啟動時調用。 構造器只會調用一次,說明Filter也是單例多線程的。
- init():在構造器被調用后,緊接着被調用。作用:用來初始化Filter。
- doFilter():每一次攔截請求時都會調用。
參數
ServletRequest request
> 請求報文
ServletResponse response
> 響應報文
FilterChain chain
> 該對象的作用就是放行請求:
可以通過 chain.doFilter(request,response) 放行請求。
當調用chain.doFilter()就相當於調用目標的資源的service方法。
- destroy方法在項目停止時調用,用來在對象被銷毀前做一些收尾工作。
> url-pattern的設置規則:
1.精確匹配:只有當目標資源的地址和url-pattern的地址一模一樣時,Filter才會攔截資源
例子:/2.jsp , 只有當瀏覽器訪問項目根目錄下的2.jsp時,才會調用Filter
2.路徑匹配:當訪問的資源在url-pattern配置的路徑下時,Filter就會攔截資源。
例子1:/hello/* , 只要訪問項目根目錄下hello下的資源,就會調用Filter。
例子2:/* , 會攔截項目根目錄下所有資源
3.后綴匹配:只要訪問的資源地址和url-pattern的后綴一樣就會調用Filter
例子:*.jsp 只要是以jsp結尾的請求都會攔截
- 以上規則適用於Servlet的url-pattern配置
- 當使用Filter攔截一個Servlet時,可以將Filter的url-pattern和Servlet的url-pattern一樣
這樣Filter就會攔截發送到Servlet的請求。
- 也可以通過在filter-mapping中添加一個servlet-name標簽來設置要攔截的Servlet的name
[4] Filter的執行順序
> 我們可以為一個資源設置多個過濾器,
當我們為一個資源設置了多個過濾器時,這些過濾器就組成一個Filter鏈的結構。
當我們去掉用chain.doFilter(),如果該過濾器后邊還有其他的過濾,
相當於調用了下一個過濾器doFilter()方法
如果過濾器后沒有其他的過濾器,我們調用chain.doFilter()
相當於調用了目標資源的service()方法。
> 多個Filter的執行順序,有filter-mapping標簽的配置順序決定,
filter-mappint靠前,則filter先執行,靠后則后執行。
> 我們可以通過修改filter-mapping的順序來修改Filter的執行順序,
但是注意,filter-mapping不能寫在filter標簽的前邊。