問題的根本原因由於響應本次請求的Response對象的狀態是已提交狀態造成的, 它不允許響應提交多次。
什么時候Response對象的狀態變成已提交狀態:當你的應用已經實現了頁面跳轉邏輯。
通常原因:
1.如果你使用了community的話,community的安全認證和授權如果沒有通過,community內部會進行頁面跳轉。
但你的應用(對於workshop應用的話,指的是action)又試圖進行頁面跳轉,就會出現這樣的問題。
/** * @jpf:action * @jpf:forward name="page" path="page.jsp" */ protected Forward actionMethod() { //如果已經提交了響應,你仍然試圖再次進行頁面跳轉,即再次提交響應,可能出現問題 //通常可以加一個判斷 if (!getResponse().isCommitted()) { return new Forward("success"); } else { return null; } } protected void beforeAction() { SecurityManager.checkAuthorization(getRequest(),getResponse(), config.getString(CDConstants.CREATE_TERM_ACTION_NAME, "")); //這個調用可能實現了頁面跳轉,即提交響應 }
注意JSP中實現頁面跳轉后,加return 語句防止繼續提交響應:
2. .如果沒有使用community的話,下面情景也會出現這個問題
/** * @jpf:action * @jpf:forward name="page" path="page.jsp" */ protected Forward actionMethod() { //直接操作Response對象寫響應 getResponse().getPrintWriter().println(); … // 又執行的頁面跳轉,也可能出現問題 return new Forward("index"); }