Posted on 2007-01-16 09:07
rednight 阅读(7023)
评论(5) 编辑 收藏
如果你碰到"Cannot Forward a Response that is Already Committed"这样的错误信息,一定是应用对一次http请求做了多次页面跳转或对response对象做过close后,又去写响应.
这个问题的根本原因由于响应本次请求的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 语句防止继续提交响应:
<%
SecurityManager.checkAuthorization(getRequest(), getResponse(), config.getString(
CDConstants.CREATE_TERM_ACTION_NAME, ""));
{
//可能有实现页面跳转逻辑
……………forward();
return;//记得加retrun.
}
%>
2. .如果没有使用community的话,下面情景也会出现这个问题
/**
* @jpf:action
* @jpf:forward name="page" path="page.jsp"
*/
protected Forward actionMethod()
//直接操作Response对象写响应
getResponse().getPrintWriter().println();
…
/
// 又执行的页面跳转,也可能出现问题
return new Forward("index");
}