【问题标题】:Servlet Filter - Dont apply filter to a specific oneServlet 过滤器 - 不要将过滤器应用于特定的过滤器
【发布时间】: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,我想绕过身份验证过滤器。我们该怎么做?

【问题讨论】:

    标签: java servlets servlet-filters web.xml


    【解决方案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。

      【讨论】:

      • 跳过过滤器的优雅方式,特别是如果您有很长的过滤器链,谢谢!
      猜你喜欢
      • 2014-01-18
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 2022-01-23
      • 2017-10-16
      • 2012-06-24
      • 2012-02-17
      • 2011-02-26
      相关资源
      最近更新 更多