JavaWeb開發之Filter中的dispatcher標籤

lvxiangan發表於2018-07-10

dispatcher元素

  2.4版本的servlet規範在部屬描述符中新增加了一個<dispatcher>元素,這個元素有四個可能的值:即REQUEST,FORWARD,INCLUDE和ERROR,可以在一個<filter-mapping>元素中加入任意數目的<dispatcher>,使得filter將會作用於直接從客戶端過來的request(REQUEST),通過forward過來的request(FORWARD),通過include過來的request(INCLUDE)和通過<error-page>過來的request(ERROR)。如果沒有指定任何< dispatcher >元素,預設值是REQUEST。 

注意:<dispatcher></dispatcher>必須寫在filter-mapping的最後。dispatcher的前提條件當然是要先滿足url-pattern,然後dispatcher有四種可能的屬性: 
1、REQUEST 

只要發起的操作是一次HTTP請求,比如請求某個URL、發起了一個GET請求、表單提交方式為POST的POST請求、表單提交方式為GET的GET請求。一次重定向則前後相當於發起了兩次請求,這些情況下有幾次請求就會走幾次指定過濾器。  

2、FOWARD 

只有噹噹前頁面是通過請求轉發轉發過來的情形時,才會走指定的過濾器 

3、INCLUDE 

只要是通過<jsp:include page="xxx.jsp" />,嵌入進來的頁面,每嵌入的一個頁面,都會走一次指定的過濾器。 

4、ERROR 假如web.xml裡面配置了<error-page></error-page>
<error-page>
    <error-code>400</error-code>
    <location>/filter/error.jsp</location>
</error-page>

<error-page>
    <error-code>404</error-code>
    <location>/filter/error.jsp</location>
</error-page>

<error-page>
    <error-code>500</error-code>
    <location>/filter/error.jsp</location>
</error-page>

意思是HTTP請求響應的狀態碼只要是400、404、500三種狀態碼之一,容器就會將請求轉發到error.jsp下,這就觸發了一次error,走進了配置的DispatchFilter。需要注意的是注意一點的是,雖然把請求轉發到error.jsp是一次forward的過程,但是配置成<dispatcher>FORWARD</dispatcher>並不會走DispatchFilter這個過濾器。 

這四種dispatcher方式可以單獨使用,也可以組合使用,配置多個<dispatcher></dispatcher> 即可。


相關文章