Servlets jetty webSocket:java.lang.IllegalStateException:Committed
我在Web应用程序中使用Jetty WebSocket 当我试图重定向到注销jsp时,我遇到了这个错误Servlets jetty webSocket:java.lang.IllegalStateException:Committed,servlets,jetty,Servlets,Jetty,我在Web应用程序中使用Jetty WebSocket 当我试图重定向到注销jsp时,我遇到了这个错误 oejs.ServletHandler:/test java.lang.IllegalStateException: Committed at org.eclipse.jetty.server.Response.resetBuffer(Response.java:1069) at javax.servlet.ServletResponseWrapper.rese
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);
此错误不可复制,但请告诉我何时可能发生此错误???发生此错误是因为您的响应已处理重定向请求,您正在尝试修改已提交的响应 解决此问题的一般方法有两种:
当您在自己的方法实现中调用super方法时,也会出现此异常 例如:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
super.doPost(req, resp); // <-- THIS IS THE PROBLEM
resp.sendRedirect("/someOtherUrl");
}
@覆盖
受保护的void doPost(HttpServletRequest-req、HttpServletResponse-resp){
super.doPost(请求、响应);//
java.lang.IllegalStateException:已提交
我想我应该对异常的含义提供一个更一般的解释。首先,Jetty应该为异常消息感到羞耻。除非开发人员已经知道它的实际含义,否则它对开发人员几乎没有帮助。异常应该是这样的:
java.lang.IllegalStateException:已发送响应头。是否尝试在发送内容后返回结果
通常,当您前往并呼叫时,会发生此异常:
resp.getOutputStream(); // or getWriter()
然后稍后尝试重定向或其他操作:
resp.sendRedirect("/someOtherUrl");
// or
return new ModelAndView("redirect:/someOtherUrl");
一旦您获得OutputStream
或Writer
以便您可以向客户端写入正文字节,Jetty就必须提交响应并发送HTTP200
和相关的头,这样它就可以开始返回正文字节。一旦发生这种情况,您就不能对状态代码或头进行重定向或任何其他更改卢比
返回正文字节后,正确的做法是从处理程序返回null
,而不是ModelAndView(…)
,或者只是将处理程序更改为返回void
我这边的原因是使用了错误url的jetty:
右:http://localhost:8080
错误:http://localhost:8080/test
假设您在Jetty server上运行的是javax.servlet.Filter
,您会遇到相同的异常。这里的问题可以完全按照Gray的描述来描述(谢谢Gray)。通常,当您去呼叫:
resp.getOutputStream(); // or getWriter()
然后
如果您调用了resp.getOutputStream();
,请确保您没有在同一请求上使用chain.doFilter(请求,响应);
。在我的@服务中有一些存储库
,在我的课程开始时,我将其声明为RepositoryFoo RepositoryFoo;
我忘了添加@Autowired
,甚至忘了将其设置为私有
,所以它编译得很好,然后在运行时我有了这个java.lang.IllegalStateException:Committed
…我浪费了一些时间才弄清楚原因!你说的“此错误不可复制”是什么意思这是偶然发生的吗?如果有帮助的话,考虑接受我的回答。除非超级班做出反应,否则我认为这是真的。请看我的答案。
chain.doFilter(request, response);