jetty webSocket:java.lang.IllegalStateException:已提交

Paw*_*wan 4 servlets jetty

我在我的Web应用程序中使用Jetty Websockets.

当我试图重定向到注销jsp时,我收到此错误

oejs.ServletHandler:/test
java.lang.IllegalStateException: Committed
        at org.eclipse.jetty.server.Response.resetBuffer(Response.java:1069)
        at javax.servlet.ServletResponseWrapper.resetBuffer(ServletResponseWrapper.java:232)
        at org.eclipse.jetty.http.gzip.GzipResponseWrapper.resetBuffer(GzipResponseWrapper.java:273)
        at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:199)
        at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:98)
Run Code Online (Sandbox Code Playgroud)

这是我重定向的方式

RequestDispatcher rd = request.getRequestDispatcher("logoff.jsp");
    rd.forward(request, response);
Run Code Online (Sandbox Code Playgroud)

这个错误不可重现,但你可以告诉我什么时候可能发生?

Gra*_*ray 13

java.lang.IllegalStateException:已提交

我以为我会对异常的含义提供更一般的解释.首先,Jetty应该以异常消息为耻.它对开发人员几乎没有帮助,除非他们已经知道它实际意味着什么.例外应该是这样的:

java.lang.IllegalStateException:响应头已经发送.您是否在发送内容后尝试返回结果?

通常,当您去电话时会发生此异常:

 resp.getOutputStream();  // or getWriter()
Run Code Online (Sandbox Code Playgroud)

然后尝试重定向或其他东西:

 resp.sendRedirect("/someOtherUrl");
 // or
 return new ModelAndView("redirect:/someOtherUrl");
Run Code Online (Sandbox Code Playgroud)

一旦你得到的OutputStream还是Writer这样你就可以写体字节的客户端,码头已提交响应和发送HTTP 200和相关的头,所以它可以开始返回主体的字节.一旦发生这种情况,您就无法进行重定向,也无法对状态代码或标头进行任何其他更改.

一旦返回body字节,正确的做法是null从处理程序返回而不是a ModelAndView(...)或只是更改处理程序返回void.


小智 1

发生这种情况是因为您的响应已经处理了重定向请求,您正在尝试修改已提交的响应。

有两种一般方法可以解决这个问题:

  1. 找出第一次重定向在哪里,并尝试修改逻辑以防止“两次重定向”场景的发生。
  2. 在每次重定向后放置一个“返回”(我个人推荐这个解决方案)。