Servlets jetty webSocket:java.lang.IllegalStateException:Committed

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

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

此错误不可复制,但请告诉我何时可能发生此错误???

发生此错误是因为您的响应已处理重定向请求,您正在尝试修改已提交的响应

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

  • 找出第一个重定向的位置,并尝试修改逻辑以防止“两个重定向”场景发生
  • 在每次重定向后放一个“return”(我个人推荐这个解决方案)

  • 当您在自己的方法实现中调用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就必须提交响应并发送HTTP
    200
    和相关的头,这样它就可以开始返回正文字节。一旦发生这种情况,您就不能对状态代码或头进行重定向或任何其他更改卢比


    返回正文字节后,正确的做法是从处理程序返回
    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);