2010-01-13 69 views

回答

44

Servlet過濾器是Chain of responsibility設計模式的實現。

所有過濾器都是鏈接的(按照它們在web.xml中的定義順序)。 chain.doFilter()正在進入鏈中的下一個元素。鏈的最後一個元素是目標資源/ servlet。

13

它調用chain對象的doFilter方法,而不是本身,所以沒有,也不會是遞歸的。

名稱chain表明,您有過濾器的序列,其中每個過濾器進行一些處理,然後傳遞到序列中的下一,所以每個對象具有chain構件以指向下一個過濾器的順序,其中在過濾器執行了自己的處理後被調用。然後序列中的最後一個可能具有null作爲chain的值,或者它自己知道它是序列中的最後一個。

1

它在內部調用過濾器鏈中下一個過濾器的doFilter,並且當鏈結束時它調用目標servlet。

0

通過調用chain.doFilter,您可以將請求/響應交給過濾器鏈中的下一個過濾器。如果你不調用它,那麼下一個過濾器(可能在你的web.xml中定義)將不會被執行。

如果你只是叫做doFilter,那麼你會有無盡的遞歸和一個stackoverflow。但是,您正在調用filterChain對象的doFilter方法,該方法指示它執行下一個過濾器。

0

不具有你所談論的任何代碼,我只能認爲你是這樣的:

class Filter implements FilterAPI { 
    private FilterAPI chain; 
    FilterAPI(FilterAPI chain) { this.chain = chain; } 
    @override void doFilter (Set setToFilter) { 
    // do some filtering on setToFilter 
    chain.doFilter(setToFilter); 
    } 
} 

如果是這樣的話,那麼你是不是叫什麼遞歸,您呼叫的doFilter()在不同的對象上。正如另一個答案中提到的,這是衆所周知的責任鏈設計模式。

+1

這似乎是c#,這篇文章標記爲java。但答案仍然正確。 – gbtimmon 2012-05-30 17:26:54

+0

我相信以上是有效的Java代碼?我只是修復了構造函數的名稱,但... – 2012-05-31 11:49:52

+0

它可能是,我很困惑,因爲我從來沒有見過java中的filterAPI接口只有java.servlet.Filter。充分表現出我自己的無知。 FilterAPI從哪裏來? – gbtimmon 2012-05-31 14:14:54

1

導致調用鏈中的下一個過濾器,或者如果調用過濾器是鏈中的最後一個過濾器,則會導致調用鏈末尾的資源。

相關問題