2012-09-27 51 views
2

我在我的Web應用程序中使用Jetty Websockets。jetty webSocket:java.lang.IllegalStateException:Committed

當我試圖重定向到一個註銷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,但你可以請告訴我什麼時候可能發生?

+0

你是什麼意思_「這個錯誤是不可複製的」_?它是零星發生的嗎? – Nishant

+0

提醒如果有幫助,請在下面接受我的回答。 – Gray

回答

1

發生這種情況是因爲您的響應已經處理了重定向請求,您正試圖修改已提交的響應。

一般有兩種方法來解決這個問題:

  1. 找出第一重定向是和嘗試修改,以防止「兩個重定向」的情況的發生邏輯。
  2. 在您的每個重定向之後放置一個「返回」(我個人推薦此解決方案)。
2

當您在自己的方法實現中調用超級方法時,您也會得到此異常。

例子:

@Override 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) { 
    super.doPost(req, resp); // <-- THIS IS THE PROBLEM 
    resp.sendRedirect("/someOtherUrl"); 
} 
+0

我不認爲這是真的,除非超類實際提交響應。看到我的答案。 – Gray

9

java.lang.IllegalStateException:承諾

我想我會提供的異常意味着什麼更廣泛的解釋。首先,Jetty應該對異常信息感到羞恥。除非開發人員已經知道它的實際含義,否則它對開發人員幾乎沒有任何幫助。例外應該是這樣的:

java.lang.IllegalStateException:已經發送了響應頭。您是否在發送內容後嘗試返回結果?

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

再後來試着做一個重定向或東西:

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

一旦你獲得了OutputStreamWriter所以你

通常當你去把這種例外情況可以將主體字節寫入客戶端,Jetty必須提交響應併發送HTTP 200和相關聯的標頭,以便它可以開始返回主體字節。一旦發生這種情況,您就無法重新定向,也不能對狀態碼或標題進行任何其他更改。

一旦返回正文字節,正確的事情是從處理程序中返回null而不是ModelAndView(...),或者只是將處理程序更改爲返回void

1

在我身邊的原因是使用帶有錯誤的URL碼頭:
權:http://localhost:8080
錯誤:http://localhost:8080/test

0

考慮你的Jetty服務器上運行javax.servlet.Filter,你面臨同樣的例外。這裏的問題可以完全描述爲格雷的描述(謝謝格雷)。

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

然後

chain.doFilter(request, response); 

如果你叫resp.getOutputStream();,請確保您不在同一請求,利用chain.doFilter(request, response);:一般來說,當你去把這種例外情況。