4

我在我的 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);

这个错误是不可重现的,但你能告诉我它什么时候会发生吗?

4

6 回答 6

15

java.lang.IllegalStateException:已提交

我想我会对异常的含义提供更一般的解释。首先,Jetty 应该对异常消息感到羞耻。它对开发人员几乎没有帮助,除非他们已经知道它的实际含义。异常应该是这样的:

java.lang.IllegalStateException:响应标头已发送。您是否在发送内容后尝试返回结果?

通常,当您打电话时会发生此异常:

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

然后尝试做重定向或其他事情:

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

一旦你得到了OutputStreamorWriter这样你就可以向客户端写入正文字节,Jetty 必须提交响应并发送 HTTP200和相关的标头,以便它可以开始返回正文字节。一旦发生这种情况,您就不能进行重定向,也不能对状态代码或标头进行任何其他更改。

一旦返回正文字节,正确的做法是null从处理程序返回而不是 aModelAndView(...)或只是将处理程序更改为 return void

于 2015-10-30T15:44:32.633 回答
2

当您在自己的方法实现中调用超级方法时,您也会遇到此异常。

例子:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
    super.doPost(req, resp); // <-- THIS IS THE PROBLEM
    resp.sendRedirect("/someOtherUrl");
}
于 2014-05-07T06:41:40.197 回答
1

发生这种情况是因为您的响应已经处理了重定向请求,您正在尝试修改已提交的响应。

解决这个问题的一般方法有两种:

  1. 找出第一个重定向在哪里,并尝试修改逻辑以防止“两次重定向”的情况发生。
  2. 在每次重定向后放置一个“return”(我个人推荐这个解决方案)。
于 2012-10-26T04:18:39.610 回答
1

我这边的原因是使用错误网址的码头:
正确:http://localhost:8080
错误:http://localhost:8080/test

于 2016-05-07T15:45:36.450 回答
0

考虑您javax.servlet.Filter在 Jetty 服务器上运行,并且您面临同样的异常。这里的问题可以完全按照格雷的描述来描述(感谢格雷)。通常,当您打电话时会发生此异常:

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

然后

chain.doFilter(request, response);

如果您致电resp.getOutputStream();,请确保您没有chain.doFilter(request, response);在同一请求中使用。

于 2017-08-22T12:22:31.657 回答
0

就我而言,我有一些存储库,我在课堂开始时将@Service其声明为RepositoryFoo repositoryFoo;

我忘了添加@Autowired甚至忘记添加它private,所以它编译得很好,然后在运行时我就有了这个java.lang.IllegalStateException: Committed……我浪费了一些时间才弄清楚原因!

于 2020-03-02T12:58:25.090 回答