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

Posted

技术标签:

【中文标题】Servlet 过滤器 - 不要将过滤器应用于特定的过滤器【英文标题】:Servlet Filter - Dont apply filter to a specific one 【发布时间】:2011-11-01 12:53:36 【问题描述】:

我有一个带有由身份验证过滤器支持的登录屏幕的 Web 应用程序。

我的 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,我想绕过身份验证过滤器。我们该怎么做?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

跳过过滤器的优雅方式,特别是如果您有很长的过滤器链,谢谢!

以上是关于Servlet 过滤器 - 不要将过滤器应用于特定的过滤器的主要内容,如果未能解决你的问题,请参考以下文章

使 servlet 过滤器适用于所有 Web 应用程序

如何通过 CSS 将阴影过滤器应用于 SVG 特定元素/路径

如何通过 CSS 将阴影过滤器应用于 SVG 特定元素/路径

Global Java Servlet Filter,有可能吗?

哪些特定用例需要 Struts2 之外但在同一个 Web 应用程序中的 servlet 过滤器?

java中的Servlet/过滤器特定异常处理