我已经发现了一些与此主题相关的问题,但我已经意识到他们都没有透露这个话题。
显然 OncePerRequestFilter 确保请求只在过滤器链中通过过滤器一次,但是当相反的情况发生时,我并不完全清楚。
很高兴看到一些使用其中一种情况的场景。还有一个关于何时以及如何在过滤器链上多次应用过滤器的示例。
例如
答案 0 :(得分:2)
OncePerRequestFilter
州的javadoc
从Servlet 3.0开始,可以调用过滤器作为a的一部分
javax.servlet.DispatcherType REQUEST
或 发送的javax.servlet.DispatcherType ASYNC
个调度 单独的线程。可以在web.xml
中配置过滤器 是否应该参与异步调度。但是,在某些方面 case servlet容器采用不同的默认配置。 因此子类可以覆盖该方法shouldNotFilterAsyncDispatch()
在两种类型的调度期间静态声明是否确实应该调用一次 为了提供线程初始化,日志记录,安全性等。 此机制补充并不替代配置的需要web.xml
中包含调度程序类型的过滤器。
这是一个额外的安全"在Spring中实现的功能,以确保无论环境如何都能正常工作。如果你看一下扩展它的类,你会发现它有很多;包括CorsFilter
。不确定是否存在不扩展它的Spring过滤器,可能不是。
答案 1 :(得分:1)
我们希望,一旦请求到达您的项目,您就应该对其进行一次身份验证和授权。然后,如果一切正常,则可以允许此请求和来自此上下文的任何其他请求访问您的 API,而无需再次通过过滤器。 OncePerRequestFilter 确保此身份验证过程只发生一次。如果我们不使用它,每当我们在内部向项目中的其他 API 发出请求时,相同的身份验证将再次发生,因为我们所有的 API 都具有相同的安全过滤器
一个常见的用例是在 Spring Security 中,其中身份验证和访问控制功能通常被实现为位于主应用程序 servlet 前面的过滤器。当使用请求分派器分派请求时,它必须再次通过过滤器链(或可能是不同的过滤器链),然后才能到达要处理它的 servlet。问题是某些安全过滤器操作只应针对一个请求执行一次。因此需要在 GenericFilterBean 上使用 OncePerRequestFilter。