Posted on 2007-01-16 09:07
rednight 閱讀(7047)
評論(5) 編輯 收藏
如果你碰到"Cannot Forward a Response that is Already Committed"這樣的錯(cuò)誤信息,一定是應(yīng)用對一次http請求做了多次頁面跳轉(zhuǎn)或?qū)esponse對象做過close后,又去寫響應(yīng).
這個(gè)問題的根本原因由于響應(yīng)本次請求的Response對象的狀態(tài)是已提交狀態(tài)造成的, 它不允許響應(yīng)提交多次。
什么時(shí)候Response對象的狀態(tài)變成已提交狀態(tài):當(dāng)你的應(yīng)用已經(jīng)實(shí)現(xiàn)了頁面跳轉(zhuǎn)邏輯。
通常原因:
1. 如果你使用了community的話, community的安全認(rèn)證和授權(quán)如果沒有通過,community內(nèi)部會(huì)進(jìn)行頁面跳轉(zhuǎn)。但你的應(yīng)用(對于workshop應(yīng)用的話,指的是action)又試圖進(jìn)行頁面跳轉(zhuǎn),就會(huì)出現(xiàn)這樣的問題。
/**
* @jpf:action
* @jpf:forward name="page" path="page.jsp"
*/
protected Forward actionMethod()
{
//如果已經(jīng)提交了響應(yīng),你仍然試圖再次進(jìn)行頁面跳轉(zhuǎn),即再次提交響應(yīng),可能出現(xiàn)問題
//通??梢约右粋€(gè)判斷
if (!getResponse().isCommitted()) {
return new Forward("success");
} else {
return null;
}
}
protected void beforeAction() {
SecurityManager.checkAuthorization(getRequest(), getResponse(), config.getString(
CDConstants.CREATE_TERM_ACTION_NAME, ""));
//這個(gè)調(diào)用可能實(shí)現(xiàn)了頁面跳轉(zhuǎn),即提交響應(yīng)
}
注意JSP中實(shí)現(xiàn)頁面跳轉(zhuǎn)后,加return 語句防止繼續(xù)提交響應(yīng):
<%
SecurityManager.checkAuthorization(getRequest(), getResponse(), config.getString(
CDConstants.CREATE_TERM_ACTION_NAME, ""));
{
//可能有實(shí)現(xiàn)頁面跳轉(zhuǎn)邏輯
……………forward();
return;//記得加retrun.
}
%>
2. .如果沒有使用community的話,下面情景也會(huì)出現(xiàn)這個(gè)問題
/**
* @jpf:action
* @jpf:forward name="page" path="page.jsp"
*/
protected Forward actionMethod()
//直接操作Response對象寫響應(yīng)
getResponse().getPrintWriter().println();
…
/
// 又執(zhí)行的頁面跳轉(zhuǎn),也可能出現(xiàn)問題
return new Forward("index");
}