我用我的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,但你能告诉我什么时候就可能发生?
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
。
当你调用超级方法在你自己的方法实现您还可以得到此异常。
例:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
super.doPost(req, resp); // <-- THIS IS THE PROBLEM
resp.sendRedirect("/someOtherUrl");
}
这是因为你的反应已经处理的重定向请求,您要修改一个坚定的回应。
有解决这个两种常规方法:
- 找出第一重定向是和尝试修改,以防止“两个重定向”的情况的发生逻辑。
- 把每个重定向后,“返回”(我个人建议这个解决方案)。
在我身边的原因是使用带有错误的URL码头:
右: http://localhost:8080
错误: http://localhost:8080/test
考虑一下你正在运行javax.servlet.Filter
Jetty服务器上,您面临着同样的例外。 可以准确地被描述成灰色的描述(感谢灰色)这里的问题。 一般来说,当你去把这种例外情况:
resp.getOutputStream(); // or getWriter()
然后
chain.doFilter(request, response);
如果你叫resp.getOutputStream();
,请确保您使用的不是chain.doFilter(request, response);
上相同的请求。