Interface Handler

All Superinterfaces:
Destroyable, Invocable, LifeCycle, Request.Handler
All Known Subinterfaces:
Handler.Collection, Handler.Container, Handler.Singleton, HandlerContainer
All Known Implementing Classes:
AbstractHandler, AbstractHandlerContainer, BufferedResponseHandler, ConditionalHandler, ConditionalHandler.Abstract, ConditionalHandler.DontHandle, ConditionalHandler.ElseNext, ConditionalHandler.Reject, ConditionalHandler.SkipNext, ConnectHandler, ConstraintSecurityHandler, ContextHandler, ContextHandlerCollection, CrossOriginHandler, DebugHandler, DefaultHandler, DelayedHandler, EagerFormHandler, EventsHandler, FastCGIProxyHandler, GracefulHandler, GzipHandler, Handler.Abstract, Handler.Abstract.NonBlocking, Handler.AbstractContainer, Handler.Sequence, Handler.Wrapper, HotSwapHandler, HttpSpiContextHandler, IdleTimeoutHandler, InetAccessHandler, LatencyRecordingHandler, MovedContextHandler, PathMappingsHandler, ProxyHandler, ProxyHandler.Forward, ProxyHandler.Reverse, QoSHandler, ResourceHandler, ResourceHandler.ResourceContext, RewriteHandler, SecuredRedirectHandler, SecurityHandler, SecurityHandler.PathMapped, Server, ServletContextHandler, ServletHandler, SessionHandler, SessionHandler, ShutdownHandler, SizeLimitHandler, StateTrackingHandler, StatisticsHandler, StatisticsHandler.MinimumDataRateHandler, ThreadLimitHandler, TryPathsHandler, WebAppContext, WebSocketUpgradeHandler, WebSocketUpgradeHandler

@ManagedObject public interface Handler extends LifeCycle, Destroyable, Request.Handler

A Jetty component that handles HTTP requests, of any version (HTTP/1.1, HTTP/2 or HTTP/3). A Handler is a Request.Handler with the addition of LifeCycle behaviours, plus variants that allow organizing Handlers as a tree structure.

Handlers may wrap the Request, Response and/or Callback and then forward the wrapped instances to their children, so that they see a modified request; and/or to intercept the read of the request content; and/or intercept the generation of the response; and/or to intercept the completion of the callback.

A Handler is an Invocable and implementations must respect the Invocable.InvocationType they declare within calls to Request.Handler.handle(Request, Response, Callback).

A minimal tree structure could be:


 Server
 `- YourCustomHandler
 

A more sophisticated tree structure:


 Server
 `- GzipHandler
    `- ContextHandlerCollection
       +- ContextHandler (contextPath="/user")
       |  `- YourUserHandler
       |- ContextHandler (contextPath="/admin")
       |  `- YourAdminHandler
       `- DefaultHandler
 

A simple Handler implementation could be:


 class SimpleHandler extends Handler.Abstract.NonBlocking
 {
     @Override
     public boolean handle(Request request, Response response, Callback callback)
     {
         // Implicitly sends a 200 OK response with no content.
         callback.succeeded();
         return true;
     }
 }
 

A more sophisticated example of a Handler that decides whether to handle requests based on their URI path:


 class YourHelloHandler extends Handler.Abstract.NonBlocking
 {
     @Override
     public boolean handle(Request request, Response response, Callback callback)
     {
         if (request.getHttpURI().getPath().startsWith("/yourPath"))
         {
             // The request is for this Handler
             response.setStatus(200);
             // The callback is completed when the write is completed.
             response.write(true, UTF_8.encode("hello"), callback);
             return true;
         }
         return false;
     }
 }
 

An example of a Handler that decides whether to pass the request to a child:


 class ConditionalHandler extends Handler.Wrapper
 {
     @Override
     public boolean handle(Request request, Response response, Callback callback)
     {
         if (request.getHttpURI().getPath().startsWith("/yourPath")
             return super.handle(request, response, callback);
         if (request.getHttpURI().getPath().startsWith("/wrong"))
         {
             Response.writeError(request, response, callback, HttpStatus.BAD_REQUEST_400);
             return true;
         }
         return false;
     }
 }
 
See Also:
  • Method Details

    • getServer

      @ManagedAttribute(value="The Server instance associated to this Handler", readonly=true) Server getServer()
      Returns:
      the Server associated with this Handler
    • setServer

      void setServer(Server server)
      Set the Server to associate to this Handler.
      Parameters:
      server - the Server to associate to this Handler