类 OncePerRequestFilter

java.lang.Object
cn.taketoday.web.servlet.filter.GenericFilterBean
cn.taketoday.web.servlet.filter.OncePerRequestFilter
所有已实现的接口:
cn.taketoday.beans.factory.Aware, cn.taketoday.beans.factory.BeanNameAware, cn.taketoday.beans.factory.DisposableBean, cn.taketoday.beans.factory.InitializingBean, cn.taketoday.context.EnvironmentAware, cn.taketoday.core.env.EnvironmentCapable, ServletContextAware, Filter
直接已知子类:
ApplicationContextHeaderFilter, CharacterEncodingFilter, CorsFilter, FormContentFilter, ForwardedHeaderFilter, HiddenHttpMethodFilter, RelativeRedirectFilter, ShallowEtagHeaderFilter

public abstract class OncePerRequestFilter extends GenericFilterBean
Filter base class that aims to guarantee a single execution per request dispatch, on any servlet container. It provides a doFilterInternal(jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse, jakarta.servlet.FilterChain) method with HttpServletRequest and HttpServletResponse arguments.

A filter may be invoked as part of a REQUEST or 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.

Yet another dispatch type that also occurs in its own thread is ERROR. Subclasses can override shouldNotFilterErrorDispatch() if they wish to declare statically if they should be invoked once during error dispatches.

The getAlreadyFilteredAttributeName() method determines how to identify that a request is already filtered. The default implementation is based on the configured name of the concrete filter instance.

从以下版本开始:
4.0 2022/2/20 15:15
作者:
Juergen Hoeller, Rossen Stoyanchev, Sam Brannen, Harry Yang
  • 字段详细资料

  • 构造器详细资料

    • OncePerRequestFilter

      public OncePerRequestFilter()
  • 方法详细资料

    • doFilter

      public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException
      This doFilter implementation stores a request attribute for "already filtered", proceeding without filtering again if the attribute is already there.
      抛出:
      ServletException
      IOException
      另请参阅:
    • skipDispatch

      private boolean skipDispatch(HttpServletRequest request)
    • isAsyncDispatch

      protected boolean isAsyncDispatch(HttpServletRequest request)
      The dispatcher type jakarta.servlet.DispatcherType.ASYNC means a filter can be invoked in more than one thread over the course of a single request. This method returns true if the filter is currently executing within an asynchronous dispatch.
      参数:
      request - the current request
    • isAsyncStarted

      protected boolean isAsyncStarted(HttpServletRequest request)
      Whether request processing is in asynchronous mode meaning that the response will not be committed after the current thread is exited.
      参数:
      request - the current request
      另请参阅:
    • getAlreadyFilteredAttributeName

      protected String getAlreadyFilteredAttributeName()
      Return the name of the request attribute that identifies that a request is already filtered.

      The default implementation takes the configured name of the concrete filter instance and appends ".FILTERED". If the filter is not fully initialized, it falls back to its class name.

      另请参阅:
    • shouldNotFilter

      protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException
      Can be overridden in subclasses for custom filtering control, returning true to avoid filtering of the given request.

      The default implementation always returns false.

      参数:
      request - current HTTP request
      返回:
      whether the given request should not be filtered
      抛出:
      ServletException - in case of errors
    • shouldNotFilterAsyncDispatch

      protected boolean shouldNotFilterAsyncDispatch()
      The dispatcher type jakarta.servlet.DispatcherType.ASYNC means a filter can be invoked in more than one thread over the course of a single request. Some filters only need to filter the initial thread (e.g. request wrapping) while others may need to be invoked at least once in each additional thread for example for setting up thread locals or to perform final processing at the very end.

      Note that although a filter can be mapped to handle specific dispatcher types via web.xml or in Java through the ServletContext, servlet containers may enforce different defaults with respect to dispatcher types. This flag enforces the design intent of the filter.

      The default return value is "true", which means the filter will not be invoked during subsequent async dispatches. If "false", the filter will be invoked during async dispatches with the same guarantees of being invoked only once during a request within a single thread.

    • shouldNotFilterErrorDispatch

      protected boolean shouldNotFilterErrorDispatch()
      Whether to filter error dispatches such as when the servlet container processes and error mapped in web.xml. The default return value is "true", which means the filter will not be invoked in case of an error dispatch.
    • doFilterInternal

      protected abstract void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException
      Same contract as for doFilter, but guaranteed to be just invoked once per request within a single request thread. See shouldNotFilterAsyncDispatch() for details.

      Provides HttpServletRequest and HttpServletResponse arguments instead of the default ServletRequest and ServletResponse ones.

      抛出:
      ServletException
      IOException
    • doFilterNestedErrorDispatch

      protected void doFilterNestedErrorDispatch(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException
      Typically an ERROR dispatch happens after the REQUEST dispatch completes, and the filter chain starts anew. On some servers however the ERROR dispatch may be nested within the REQUEST dispatch, e.g. as a result of calling sendError on the response. In that case we are still in the filter chain, on the same thread, but the request and response have been switched to the original, unwrapped ones.

      Sub-classes may use this method to filter such nested ERROR dispatches and re-apply wrapping on the request or response. ThreadLocal context, if any, should still be active as we are still nested within the filter chain.

      抛出:
      ServletException
      IOException