问题的根本原因由于响应本次请求的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"); }