码头的WebSocket:java.lang.IllegalStateException:承诺(je

2019-07-31 23:56发布

我用我的Web应用程序的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)

这就是我重定向方式

RequestDispatcher rd = request.getRequestDispatcher("logoff.jsp");
    rd.forward(request, response);

此错误不是reproduceble,但你能告诉我什么时候就可能发生?

Answer 1:

java.lang.IllegalStateException:承诺

我想我会提供的异常意味着什么更广泛的解释。 首先,码头应该是由异常消息惭愧。 它提供了几乎没有任何帮助开发者,除非他们已经知道它的实际含义。 唯一的例外应该是这样的:

java.lang.IllegalStateException:响应头已经被发送。 你们是不是要返回发送内容后的结果?

一般来说,当你去把这种例外情况:

 resp.getOutputStream();  // or getWriter()

再后来试着做一个重定向或东西:

 resp.sendRedirect("/someOtherUrl");
 // or
 return new ModelAndView("redirect:/someOtherUrl");

一旦你获得OutputStream或者Writer ,所以你可以编写主体的字节到客户端,码头已提交响应和发送HTTP 200和相关的头文件,因此它可以开始返回主体的字节。 一旦出现这种情况,你再不能做重定向也不做任何其他更改状态码或头。

正确的事情,一旦你回到主体的字节,是返回null从处理程序,而不是一个ModelAndView(...)或者只是改变了处理程序返回void



Answer 2:

当你调用超级方法在你自己的方法实现您还可以得到此异常。

例:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
    super.doPost(req, resp); // <-- THIS IS THE PROBLEM
    resp.sendRedirect("/someOtherUrl");
}


Answer 3:

这是因为你的反应已经处理的重定向请求,您要修改一个坚定的回应。

有解决这个两种常规方法:

  1. 找出第一重定向是和尝试修改,以防止“两个重定向”的情况的发生逻辑。
  2. 把每个重定向后,“返回”(我个人建议这个解决方案)。


Answer 4:

在我身边的原因是使用带有错误的URL码头:
右: http://localhost:8080
错误: http://localhost:8080/test



Answer 5:

考虑一下你正在运行javax.servlet.Filter Jetty服务器上,您面临着同样的例外。 可以准确地被描述成灰色的描述(感谢灰色)这里的问题。 一般来说,当你去把这种例外情况:

resp.getOutputStream();  // or getWriter()

然后

chain.doFilter(request, response);

如果你叫resp.getOutputStream(); ,请确保您使用的不是chain.doFilter(request, response); 上相同的请求。



文章来源: jetty webSocket : java.lang.IllegalStateException: Committed