2015-10-17 55 views
1

我在閱讀關於Java過濾器,我瞭解它的實現以及如何使用它,但我不知道我們爲什麼使用它。 當我讀取過濾器用於過濾url以保存/保護資源免遭非法訪問,但我很困惑,我們可以做到這一點與會話然後爲什麼過濾器?從here讀完完整的詳細信息後。我得到這個段落太接近,無法清除我的概念。Java Servlets過濾器如何有用

在上一篇文章中,我們瞭解到我們如何能夠在網絡 應用程序管理會話,如果我們要確保資源的訪問 只有當用戶會話是有效的,我們能做到這一點使用的servlet 會議屬性。這種方法很簡單,但如果我們有很多 servlets和jsps,那麼由於 冗餘代碼,它將變得很難維護。如果我們想在將來改變屬性名稱,我們 將不得不改變我們有會話 認證的所有地方。

確定上面的段落清理概念作爲理論基礎,但任何人都可以向我展示程序的例子,顯示過濾器對Java Servlets真正有用。 Web應用程序或資源如何影響使用和不使用過濾器?

+0

該博客是錯誤地編寫的,你以不同的方式理解它。 –

+0

@sᴜʀᴇsʜᴀᴛᴛᴀ你能清楚我的困惑嗎?爲什麼我們需要/使用servlet? – UnKnown

+0

簡單的答案是過濾請求和長的回答將需要最近一個小時解釋;)總是閱讀官方文檔 –

回答

-1

過濾器的好處之一是您可以將過濾器應用於許多Servlet,而不是在您擁有的每個servlet中編寫相同的代碼。

編輯:爲避免混淆,您不直接對servlet應用過濾器,而是對URI應用過濾器。

4

假設您有一個包含300個servlet的大型Web應用程序,並且只有通過身份驗證才能訪問其中的250個。爲了防止未經認證的用戶訪問這些250個servlets時,你將不得不在每一個這些的servlet,以重複以下僞代碼:

if (!currentUser.isAuthenticated()) { 
    throw new ForbiddenException(); 
} 

,並引入了251th Servlet時,你必須忘記的一大機會添加該檢查。

過濾器允許說容器:對於所有的請求去/private/*,在調用映射到URL的servlet之前執行以下過濾器。

然後,您可以忘記檢查250個servlet中的身份驗證,並在過濾器中只執行一次。

當然還有其他用例:授權檢查,記錄,測量性能等

+0

@JBNizat,當我讀取servlet之前自動調用的過濾器,但假設我有2個或更多過濾器如何連接到servlet?是指爲哪個servlet調用哪個過濾器? – UnKnown

+0

就像servlet映射到URL一樣,過濾器也是。您還可以將篩選器映射到servlet,這意味着只要對該servlet發出請求就會調用該篩選器。 –

+0

最好有一個過濾器超過250個servlets是噩夢。 –

0

濾器任何servlet之前調用。這是主要的區別。過濾器的一個很好的例子是Struts2過濾器。

<filter> 
     <filter-name>struts2</filter-name> 
     <filter-class>org.apache.struts2.dispatcher.filter.ng.StrutsPrepareAndExecuteFilter</filter-class> 
</filter> 
+0

假設我有Servlet'A'和Filter'B',我可以如何映射它們,當調用Servlet'A'然後自動調用Filter'''時。 – UnKnown

+0

映射它們'/ *'意味着所有的東西 –

+0

@RomanC但是如果我用其他地圖代替'/ *'那麼呢?該過濾器將只爲該URL調用? – UnKnown