Java Servlet筛选器-不将筛选器应用于特定筛选器

Java Servlet筛选器-不将筛选器应用于特定筛选器,java,servlets,servlet-filters,web.xml,Java,Servlets,Servlet Filters,Web.xml,我有一个web应用程序,其登录屏幕由身份验证过滤器备份 我的web.xml中有以下内容 <filter> <filter-name>AuthenticationFilter</filter-name> <display-name>AuthenticationFilter</display-name> <filter-class>com.mycompany.secutity.Authentication

我有一个web应用程序,其登录屏幕由身份验证过滤器备份

我的web.xml中有以下内容

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

身份验证过滤器
身份验证过滤器
com.mycompany.secutity.AuthenticationFilter
我有下面的映射-

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

身份验证过滤器
/*

但是现在我想添加一个例外,对于特定的servlet
/web/MyNewServlet
,我想绕过authentication过滤器。我们如何做到这一点?

有两种方法可以做到这一点:

  • /*
    模式重新映射到另一个模式,如
    /subdir/*
    ,从而避免对
    /web/MyNewServlet
    应用AuthenticationFilter。这是一个麻烦的过程,因为您的web应用程序中可能有几个URL现在需要重新映射。我建议您在开发的早期,或者在没有太多URL需要重新映射的时候这样做
  • 在过滤器实现中以编程方式包含排除规则。您需要使用和类似的方法来验证URL片段是否包含
    /web/MyNewServlet
    ,然后将筛选器链接到下一个筛选器或servlet,而不是执行筛选器主体

稍微扩展Vinet的想法,您可以添加另一个过滤器,称为DoesNotNeedAuthenticationFilter,它在AuthenticationFilter之前运行,只需在请求上设置属性DoesNotNeedAuthenticationFilter。然后AuthenticationFilter可以检查该属性,并传递具有该属性的任何请求。然后,您可以使用普通筛选器映射机制将DoesNotNeedAuthenticationFilter应用于适当的URL或servlet。

跳过筛选器的优雅方式,特别是如果您有一长串筛选器,谢谢!