2011-08-22 153 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