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

标签 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)

这是我重定向的方式
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");

一旦您收到 OutputStreamWriter因此您可以将正文字节写入客户端,Jetty 必须提交响应并发送 HTTP 200和相关的 header ,因此它可以开始返回正文字节。一旦发生这种情况,您就无法进行重定向,也无法对状态代码或标题进行任何其他更改。

一旦返回正文字节,正确的做法是返回 null来自处理程序而不是 ModelAndView(...)或者只是更改处理程序以返回 void .

关于servlets - jetty webSocket : java. lang.IllegalStateException:已提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12619452/

相关文章:

jsp - 如何解决 org.apache.jasper.JasperException : java. lang.IllegalStateException:没有可用的 Java 编译器

google-app-engine - Google App Engine Servlet 设计

java - 带数据库的 Servlet 在 Eclipse 中工作正常但在服务器上崩溃?

tomcat - 我们可以将 solr 索引从一台服务器传输到另一台服务器而不是重新索引吗

mysql - 将 JDBC 引用保留在 web.xml 之外以部署在 Jetty 中,就像在 tomcat 中一样

java - 如何确认客户端收到响应

java - 如何在 jetty 服务器上使用 war 文件之外的文件?

jetty - 如何设置 jetty 服务器的连接/请求超时?

java - 如何使用 Jetty 客户端获取基于请求的连接所花费的时间

java - 从jetty中运行的Web应用程序访问本地目录图像