filter所謂的特性

2021-09-30 06:59:04 字數 2718 閱讀 7094

其實在07-02這個例子裡,我們使用了兩個過濾器,encodingfilter負責設定編碼,securityfilter負責控制許可權,那這兩個過濾器是怎麼起作用的呢?它們兩個同時過濾乙個請求時誰先誰後呢?

下面這個圖會告訴我們答案。

所有的奧秘就在filter中的filterchain中。伺服器會按照web.xml中過濾器定義的先後循序組裝成一條鏈,然後一次執行其中的dofilter()方法。執行的順序就如上圖所示,執行第乙個過濾器的chain.dofilter()之前的**,第二個過濾器的chain.dofilter()之前的**,請求的資源,第二個過濾器的chain.dofilter()之後的**,第乙個過濾器的chain.dofilter()之後的**,最後返回響應。

因此在07-02中執行的**順序是:

執行encodingfilter.dofilter()中chain.dofilter()之前的部分:request.setcharacterencoding("gb2312");

執行securityfilter.dofilter()中chain.dofilter()之前的部分:判斷使用者是否已登入。

如果使用者已登入,則訪問請求的資源:/admin/index.jsp。

如果使用者未登入,則頁面重定向到:/failure.jsp。

執行securityfilter.dofilter()中chain.dofilter()之後的部分:這裡沒有**。

執行encodingfilter.dofilter()中chain.dofilter()之後的部分:這裡也沒有**。

過濾鏈的好處是,執行過程中任何時候都可以打斷,只要不執行chain.dofilter()就不會再執行後面的過濾器和請求的內容。而在實際使用時,就要特別注意過濾鏈的執行順序問題,像encodingfilter就一定要放在所有filter之前,這樣才能確保在使用請求中的資料前設定正確的編碼。

我們已經了解了filter的基本用法,還有一些細節配置在特殊情況下起作用。

在servlet-2.3中,filter會過濾一切請求,包括伺服器內部使用forward**請求和的情況。

到了servlet-2.4中filter預設下只攔截外部提交的請求,forward和include這些內部**都不會被過濾,但是有時候我們需要forward的時候也用到filter,這樣就需要如下配置。

<filter>

<filter-name>testfilter</filtername>

<filter-class>anni.testfilter</filter-class>

</filter>

<filter-name>testfilter</filtername>

<url-pattern>/*</url-pattern>

<dispatcher>request</dispatcher>

<dispatcher>forward</dispatcher>

<dispatcher>include</dispatcher>

<dispatcher>exception</dispatcher>

這樣testfilter就會過濾所有狀態下的請求。如果我們沒有進行設定,預設使用的就是request。而exception是在iserrorpage="true"的情況下出現的,這個用處不多,看一下即可。

這裡forward是解決request.getdispatcher("index.jsp").forward(request, response);無法觸發filter的關鍵,配置上這個以後再進行forward的時候就可以觸發過濾器了。

<filter-name>testfilter</filter-name>

<servlet-name>testservlet</servlet-name>

<servlet>

<servlet-name>testservlet</servlet-name>

<servlet-class>anni.testservlet</servlet-class>

</servlet>

<servlet-name>testservlet</servlet-name>

<url-pattern>/testservlet</url-pattern>

直接指定servlet-name,testfilter便會引用testservlet配置的url-pattern,在某些filter與servlet繫結的情況下不失為乙個好辦法。

所謂的專案管理

乙個新專案要開始了,專案管理者找去吩咐 新專案要開始了云云.於是,product spec.拿過來,看要從 開始,實現什麼應用,開始做了 先看人怎麼安排了.如果不須要新做某個應用,只是從已有的專案中搬過來,一般字典可以乙個人,如果字典多的話就兩個人,personal info management乙...

所謂的型別轉換

以前,你知道乙個變數的值儲存為二進位制位的序列,和變數的資料型別告訴編譯器如何翻譯成有意義的值的位。經常的情況是,需要將資料從一種型別轉換為另一種型別。這就是所謂的型別轉換。隱式型別轉換是自動完成的編譯器每當從不同型別資料的混合。當從一種型別的值分配給另乙個型別,編譯器會隱式地轉換為價值為價值的新型...

所謂的 雙向BFS

雙向bfs,既然是雙向的,那麼就得知道起點和終點,這樣,我們就可以進行雙向搜尋了。但是,雙向bfs是否真的可以提高效率呢?如果能,那麼又能提高多少呢?看到過乙個圖,說雙bfs可以在bfs的基礎上把時間和空間複雜度上都減半。實際上,在許多的實際應用中,往往不僅僅是減半!我們假設,單向bfs需要搜尋n層...