为什么在Spring中使用OncePerRequestFilter?

时间:2016-03-14 01:56:53

标签: java spring servlets filter

正如文件所说:

  

过滤基类,旨在保证每次执行一次   请求调度,在任何servlet容器上。

有一个问题 What is OncePerRequestFilter? 我仍然不知道为什么要使用它。

它表示"在任何servlet容器上#34;。这意味着有多个servlet容器会多次执行过滤器?

3 个答案:

答案 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过滤器,可能不是。