Class ThreadLimitHandler

All Implemented Interfaces:
Handler, Handler.Container, Handler.Singleton, Request.Handler, org.eclipse.jetty.util.component.Container, org.eclipse.jetty.util.component.Destroyable, org.eclipse.jetty.util.component.Dumpable, org.eclipse.jetty.util.component.Dumpable.DumpableContainer, org.eclipse.jetty.util.component.LifeCycle, org.eclipse.jetty.util.thread.Invocable

public class ThreadLimitHandler extends ConditionalHandler.Abstract

Handler to limit the number of concurrent threads per remote IP address, for DOS protection.

ThreadLimitHandler applies a limit to the number of threads that can be used simultaneously per remote IP address.

The handler makes a determination of the remote IP separately to any that may be made by the ForwardedRequestCustomizer or similar:

  • This handler will use only a single style of forwarded header. This is on the assumption that a trusted local proxy will produce only a single forwarded header and that any additional headers are likely from untrusted client side proxies.
  • If multiple instances of a forwarded header are provided, this handler will use the right-most instance, which will have been set from the trusted local proxy

Requests in excess of the limit will be asynchronously suspended until a thread is available.

  • Constructor Details

    • ThreadLimitHandler

      public ThreadLimitHandler()
    • ThreadLimitHandler

      public ThreadLimitHandler(@Name("forwardedHeader") String forwardedHeader)
    • ThreadLimitHandler

      public ThreadLimitHandler(@Name("forwardedHeader") String forwardedHeader, @Name("rfc7239") boolean rfc7239)
    • ThreadLimitHandler

      public ThreadLimitHandler(@Name("handler") Handler handler, @Name("forwardedHeader") String forwardedHeader, @Name("rfc7239") boolean rfc7239)
  • Method Details

    • doStart

      protected void doStart() throws Exception
      Overrides:
      doStart in class ConditionalHandler
      Throws:
      Exception
    • isEnabled

      @ManagedAttribute("Whether this handler is enabled") public boolean isEnabled()
    • setEnabled

      public void setEnabled(boolean enabled)
    • getThreadLimit

      @ManagedAttribute("The maximum threads that can be dispatched per remote IP") public int getThreadLimit()
    • getThreadLimit

      protected int getThreadLimit(String ip)
    • setThreadLimit

      public void setThreadLimit(int threadLimit)
    • include

      @ManagedOperation("Include IP in thread limits") public void include(String inetAddressPattern)
    • exclude

      @ManagedOperation("Exclude IP from thread limits") public void exclude(String inetAddressPattern)
    • onConditionsMet

      public boolean onConditionsMet(Request request, Response response, org.eclipse.jetty.util.Callback callback) throws Exception
      Description copied from class: ConditionalHandler
      Handle a request that has met the conditions. Typically, the implementation will provide optional handling and then call the ConditionalHandler.nextHandler(Request, Response, Callback) method to continue handling.
      Specified by:
      onConditionsMet in class ConditionalHandler
      Parameters:
      request - The request to handle
      response - The response to generate
      callback - The callback for completion
      Returns:
      True if this handler will complete the callback
      Throws:
      Exception - If there is a problem handling
      See Also:
    • onConditionsNotMet

      protected boolean onConditionsNotMet(Request request, Response response, org.eclipse.jetty.util.Callback callback) throws Exception
      Description copied from class: ConditionalHandler
      This method is called when the request has not met the conditions and is not to be handled by this handler. Implementations may return false; send an error response; or handle the request differently.
      Specified by:
      onConditionsNotMet in class ConditionalHandler
      Parameters:
      request - The request to handle
      response - The response to generate
      callback - The callback for completion
      Returns:
      True if this handler will complete the callback
      Throws:
      Exception - If there is a problem handling
      See Also:
    • getRemoteIP

      protected String getRemoteIP(Request baseRequest)