GenericFilterBean vs OncePerRequestFilter 何时分别使用?

GenericFilterBean vs OncePerRequestFilter when to use each?

我已经发现了一些与此主题相关的问题,但我发现其中 none 个问题阐明了此主题。

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

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

例如

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

OncePerRequestFilter 状态的 javadoc

As of Servlet 3.0, a filter may be invoked as part of a javax.servlet.DispatcherType REQUEST or javax.servlet.DispatcherType ASYNC dispatches that occur in separate threads. A filter can be configured in web.xml whether it should be involved in async dispatches. However, in some cases servlet containers assume different default configuration. Therefore sub-classes can override the method shouldNotFilterAsyncDispatch() to declare statically if they should indeed be invoked, once, during both types of dispatches in order to provide thread initialization, logging, security, and so on. This mechanism complements and does not replace the need to configure a filter in web.xml with dispatcher types.

所以这是 "safety" 在 Spring 中实现的附加功能,以确保无论环境如何,一切都一样。如果您查看扩展它的 类,您会发现有很多;包括 CorsFilter。不确定是否有 Spring 个 扩展它的过滤器,可能不会。

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

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