【问题标题】:GenericFilterBean vs OncePerRequestFilter when to use each?GenericFilterBean vs OncePerRequestFilter 什么时候使用?
【发布时间】:2018-10-28 20:53:23
【问题描述】:

我已经找到了一些与此主题相关的问题,但我意识到没有一个问题能够阐明这个主题。

显然 OncePerRequestFilter 确保请求在过滤器链中仅通过过滤器一次,但我不清楚何时会发生相反的情况。

很高兴看到一些使用其中一种或另一种的场景。还有一个关于何时以及如何在过滤器链上多次应用过滤器的示例。

例如

  1. 对于 JWT 过滤器,应该使用哪个实现以及为什么?
  2. 对于 CORS 过滤器,应该使用哪个实现,为什么? 等

【问题讨论】:

    标签: java spring spring-mvc servlets servlet-3.0


    【解决方案1】:

    OncePerRequestFilter 状态的 javadoc

    从 Servlet 3.0 开始,过滤器可以作为 javax.servlet.DispatcherType REQUESTjavax.servlet.DispatcherType ASYNC 发生在 单独的线程。过滤器可以在web.xml中配置 是否应该参与异步调度。然而,在一些 case servlet 容器采用不同的默认配置。 因此子类可以覆盖该方法 shouldNotFilterAsyncDispatch() 在两种类型的调度期间静态声明它们是否确实应该被调用,一次 为了提供线程初始化、日志记录、安全等。 这种机制补充而不是取代配置的需要 web.xml 中带有调度程序类型的过滤器。

    因此,这是 Spring 中实现的附加“安全”功能,以确保无论环境如何,事情都可以正常工作。如果您查看扩展它的类,您会发现有很多;包括CorsFilter。不确定是否有 扩展它的 Spring 过滤器,可能没有。

    【讨论】:

    • 你能举一个不符合 Javadoc 描述的例子吗? “在不同线程中发生的调度”我对这种风格更感兴趣
    • 类 javadoc 列出了在不同线程中完成的 ASYNCERROR 调度。这个想法是,如果请求在单个线程中完全执行,则创建过滤器来处理它没有问题,但如果请求在其生命周期内使用不同的线程,则默认过滤机制就不再那么明显了。
    【解决方案2】:

    我们希望您的项目收到请求后,您应该对其进行一次身份验证和授权。然后,如果一切正常,则可以允许此请求和来自此上下文的任何其他请求访问您的 API,而无需再次通过过滤器。 OncePerRequestFilter 确保此身份验证过程只发生一次。如果我们不使用它,每当我们在内部向项目中的某个其他 API 发出请求时,将再次发生相同的身份验证,因为我们所有的 API 都具有相同的安全过滤器

    一个常见的用例是在 Spring Security 中,其中身份验证和访问控制功能通常作为位于主应用程序 servlet 前面的过滤器来实现。当使用请求分派器分派请求时,它必须再次通过过滤器链(或者可能是另一个过滤器链),然后才能到达将要处理它的 servlet。问题是某些安全过滤器操作应该只对请求执行一次。因此需要在 GenericFilterBean 上使用 OncePerRequestFilter。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-09
      • 2015-05-14
      • 2021-02-01
      • 1970-01-01
      • 2015-10-27
      • 2011-08-17
      • 2013-09-14
      • 1970-01-01
      相关资源
      最近更新 更多