正如文件所说:
过滤基类,旨在保证每次执行一次 请求调度,在任何servlet容器上。
有一个问题 What is OncePerRequestFilter? 我仍然不知道为什么要使用它。
它表示"在任何servlet容器上#34;。这意味着有多个servlet容器会多次执行过滤器?
答案 0 :(得分:1)
一个用例是编写自己的自定义过滤器,扩展OncePerRequestFilter。
这可确保您的自定义过滤器在请求进入时位于前线,并且规范确保它已执行。
希望有所帮助。
答案 1 :(得分:1)
我也here回答了。 要了解 OncePerRequestFilter 的作用,我们需要首先清楚地了解普通过滤器的行为。 如果要在Servlet执行之前或之后执行某些特定代码,则创建一个过滤器,其工作方式为:
code1 ===> servlet execution (using chain.doFilter()) ===> code2
因此code1在servlet之前执行,而code2在servlet执行之后。 但是在这里,在执行servlet时,可能会有其他请求发送到不同的servlet,并且该不同的servlet也具有相同的过滤器。 在这种情况下,此过滤器将再次执行。
OncePerRequestFilter 阻止了此行为。对于我们的一个请求,此过滤器将恰好执行一次(不多不少)。使用安全认证时,此行为非常有用。
答案 2 :(得分:0)
OncePerRequestFilter状态的Javadoc
从Servlet 3.0开始,过滤器可以作为在单独线程中发生的javax.servlet.DispatcherType REQUEST或javax.servlet.DispatcherType ASYNC调度的一部分来调用。可以在web.xml中配置过滤器,是否应将其包含在异步调度中。但是,在某些情况下,servlet容器采用不同的默认配置。因此,子类可以重写方法shouldNotFilterAsyncDispatch()来静态声明是否确实应在两种类型的调度期间一次调用它们,以提供线程初始化,日志记录,安全性等。这种机制补充了并没有取代在Web.xml中使用调度程序类型配置过滤器的需求。
因此,这是Spring中实现的另一项“安全”功能,以确保无论环境如何,它们都可以正常工作。如果查看扩展它的类,您会发现很多东西;包括CorsFilter。不知道是否有不扩展它的Spring过滤器,可能不是。