Home > Enterprise >  Strange jetty warning "java.lang.IllegalStateException: Committed" on redirecting, how to
Strange jetty warning "java.lang.IllegalStateException: Committed" on redirecting, how to

Time:05-28

I have a custom Jetty redirect Handler:


  object RedirectHandler extends HandlerWrapper {

    override def handle(
        target: String,
        baseRequest: Request,
        request: HttpServletRequest,
        response: HttpServletResponse
    ): Unit = {

      require(!response.isCommitted)

      val redirectURIOpt = rewrite(request.getRequestURI)
      redirectURIOpt.foreach { v =>
        response.sendRedirect(v)
        require(response.isCommitted)
      }
    }

    def rewrite(target: String): Option[String] = {
      if (target.endsWith(".html")) None
      else {
        var _target = target.stripSuffix("/")
        if (_target.nonEmpty) {
          _target  = ".html"
          Some(_target)
        } else {
          None
        }
      }
    }
  }

It is configured to work with an ordinary ResourceHandler to set up a web server:

...

    val server = new Server(10092)

    val resourceHandler = new ResourceHandler

    resourceHandler.setDirectoriesListed(true)
//    resource_handler.setWelcomeFiles(Array[String]("test-sites.html"))
    resourceHandler.setResourceBase(CommonConst.USER_DIR \\ "test-sites")

    val handlers = new HandlerList
    handlers.setHandlers(Array(RedirectHandler, resourceHandler))
    server.setHandler(handlers)

Every time a redirect is triggered, I found a strange warning message:

WARN HttpChannel: /test-sites/e-commerce/static
java.lang.IllegalStateException: Committed
    at org.sparkproject.jetty.server.HttpChannel.resetBuffer(HttpChannel.java:994)
    at org.sparkproject.jetty.server.HttpOutput.resetBuffer(HttpOutput.java:1459)
    at org.sparkproject.jetty.server.Response.resetBuffer(Response.java:1217)
    at org.sparkproject.jetty.server.Response.sendRedirect(Response.java:569)
    at org.sparkproject.jetty.server.Response.sendRedirect(Response.java:503)
    at org.sparkproject.jetty.server.Response.sendRedirect(Response.java:578)
    at org.sparkproject.jetty.server.ResourceService.sendWelcome(ResourceService.java:398)
    at org.sparkproject.jetty.server.ResourceService.doGet(ResourceService.java:257)
    at org.sparkproject.jetty.server.handler.ResourceHandler.handle(ResourceHandler.java:262)
    at org.sparkproject.jetty.server.handler.HandlerList.handle(HandlerList.java:59)
    at org.sparkproject.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at org.sparkproject.jetty.server.Server.handle(Server.java:516)
    at org.sparkproject.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:388)
    at org.sparkproject.jetty.server.HttpChannel.dispatch(HttpChannel.java:633)
    at org.sparkproject.jetty.server.HttpChannel.handle(HttpChannel.java:380)
    at org.sparkproject.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
    at org.sparkproject.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
    at org.sparkproject.jetty.io.FillInterest.fillable(FillInterest.java:105)
    at org.sparkproject.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
    at org.sparkproject.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
    at org.sparkproject.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
    at java.lang.Thread.run(Thread.java:748)

According to this post:

jetty webSocket : java.lang.IllegalStateException: Committed

The problem is triggered if the response is further tampered after sendRedirect. However, given that resourceHandler is a very mature component, it is very unlikely to make that low level mistake.

So what are the possible causes, and more importantly, what can be done to fix it by declaring the redirect response to be final?

CodePudding user response:

You missed the baseRequest.setHandled(true) to tell Jetty to stop processing further Handlers. You use this when your Handler produces a response (or handles the request).

A later handler (ResourceHandler according to your stacktrace) attempted to write a response and was smacked down because the response was already committed.

  • Related