Servlet过滤器 - 不要将过滤器应用于特定的过滤器

时间:2011-08-22 22:38:30

标签: java servlets servlet-filters web.xml

我有一个带有登录屏幕的网络应用程序,由身份验证过滤器备份。

我的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,我想绕过验证过滤器。我们怎么做到这一点?

2 个答案:

答案 0 :(得分:6)

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

  • /*模式重新映射到/subdir/*等其他模式,从而避免将AuthenticationFilter应用于/web/MyNewServlet。这是一个繁琐的过程,因为您的Web应用程序中可能有多个URL现在需要重新映射。我建议您在开发的早期或在没有太多网址重新映射的情况下这样做。
  • 以编程方式在Filter实现中包含排除规则。您将需要使用HttpServletRequest.getServletPath和类似的方法来验证URL片段是否包含/web/MyNewServlet,然后将过滤器链接到下一个过滤器或servlet,而不是执行过滤器的主体。

答案 1 :(得分:4)

稍微扩展Vineet的想法,您可以添加另一个过滤器,称为DoesNotNeedAuthenticationFilter,它在AuthenticationFilter之前运行,并且只在请求上设置属性DOES_NOT_NEED_AUTHENTICATION。然后,AuthenticationFilter可以检查该属性,并传递拥有该属性的任何请求。然后,您可以使用常规过滤器映射机制将DoesNotNeedAuthenticationFilter应用于相应的URL或servlet。