【KMS】Cannot forward a response that is already committed

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

}
原文地址:https://www.cnblogs.com/orientsun/p/2610413.html