我在我的 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)
这是我重定向的方式
RequestDispatcher rd = request.getRequestDispatcher("logoff.jsp");
rd.forward(request, response);
这个错误是不可重现的,但是你能告诉我它什么时候会发生吗??
最佳答案
java.lang.IllegalStateException: Committed
我想我会对异常的含义提供更一般的解释。首先,Jetty 应该为异常消息感到羞耻。它对开发人员几乎没有帮助,除非他们已经知道它的实际含义。异常应该是这样的:
java.lang.IllegalStateException: Response headers have already been sent. Are you trying to return a result after sending content?
通常,当您去调用时会发生此异常:
resp.getOutputStream(); // or getWriter()
然后稍后尝试进行重定向或其他操作:
resp.sendRedirect("/someOtherUrl");
// or
return new ModelAndView("redirect:/someOtherUrl");
一旦您收到
OutputStream
或 Writer
因此您可以将正文字节写入客户端,Jetty 必须提交响应并发送 HTTP 200
和相关的 header ,因此它可以开始返回正文字节。一旦发生这种情况,您就无法进行重定向,也无法对状态代码或标题进行任何其他更改。一旦返回正文字节,正确的做法是返回
null
来自处理程序而不是 ModelAndView(...)
或者只是更改处理程序以返回 void
.
关于servlets - jetty webSocket : java. lang.IllegalStateException:已提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12619452/