2011-08-22 152 views
6

我有一個帶有認證過濾器備份的登錄屏幕的Web應用程序。Servlet過濾器 - 不要將過濾器應用於特定的過濾器

我有我的web.xml

<filter> 
    <filter-name>AuthenticationFilter</filter-name> 
    <display-name>AuthenticationFilter</display-name> 
    <filter-class>com.mycompany.secutity.AuthenticationFilter</filter-class> 
</filter> 

下面我有下面的映射 -

<filter-mapping> 
    <filter-name>AuthenticationFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

但現在我想在那裏添加一個例外特定的servlet /web/MyNewServlet,我想繞過認證過濾器。我們應該怎麼做?

回答

5

有兩種方式,你可以這樣做:

  • 重新映射/*圖案像/subdir/*另一種模式,從而被施加反/web/MyNewServlet避免AuthenticationFilter。這是一個繁瑣的過程,因爲您的Web應用程序中可能有幾個URL現在需要重新映射。我建議您在開發過程中儘早做到這一點,或者當您沒有太多URL來重新映射時。
  • 在您的過濾器實現中以編程方式包含排除規則。您將需要使用HttpServletRequest.getServletPath和類似的方法來驗證URL片段是否包含/web/MyNewServlet,然後將篩選器鏈接到下一個篩選器或servlet,而不是執行篩選器的主體。
4

擴展維尼特的想法咯,你可以添加其他過濾器,稱爲像DoesNotNeedAuthenticationFilter,其中AuthenticationFilter之前運行,而只是設置在請求中的屬性DOES_NOT_NEED_AUTHENTICATION。然後,AuthenticationFilter可以檢查該屬性,並傳遞任何具有該屬性的請求。然後,您可以使用常規過濾器映射機制將DoesNotNeedAuthenticationFilter應用於相應的URL或servlet。

+0

優雅的方式來跳過過濾器,特別是如果你有一個長鏈過濾器,謝謝! – Sohail