当前位置:首页 > 开发 > Web前端 > 前端 > 正文

IllegalStateException: Cannot forward a response that is already committed

发表于: 2014-04-18   作者:Cwind   来源:转载   浏览:
摘要: 对于初学者来说,一个常见的误解是:当调用 forward() 或者 sendRedirect() 时控制流将会自动跳出原函数。标题所示错误通常是基于此误解而引起的。 示例代码: protected void doPost() { if (someCondition) { sendRedirect(); } forward(); // Thi
对于初学者来说,一个常见的误解是:当调用 forward() 或者 sendRedirect() 时控制流将会自动跳出原函数。标题所示错误通常是基于此误解而引起的。
示例代码:
protected void doPost() {
    if (someCondition) {
        sendRedirect();
    }
    forward(); // This is STILL invoked when someCondition is true!}
forward() 和 sendRedirect() 与system.exit() 不同,当上例中的 someCondition为true时,很有可能得到此异常:
IllegalStateException: Cannot forward a response that is already committed
为了解决此问题,可以在sendRedirect() / forward() 之后加上 return;
protected void doPost() {
    if (someCondition) {
        sendRedirect();
        return;
    }
    forward();}
    或者把后一个forward() 放入else中
protected void doPost() {
    if (someCondition) {
        sendRedirect();
    }else{
        forward();
    }
}
上文所述是引起该异常的最常见的情况;近日在一个由服务器下载文件函数中避免了上述问题,但仍然出现了此异常。除去冗余部分的函数如下:
public void download(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          ...
          OutputStream out = response.getOutputStream();
          try {
             ...
             out.write();       
          } catch (Exception e){
               log.error(e.getMessage());
          } finally {
             if (out!=null ){
               out.flush();
               out.close();
          }
          ...
          forward();
   }  
Server端在提交response到Client端之前会向一个缓冲区写入相应头和状态码,然后将内容清空。而一旦缓冲区被清空就标志着该response已被提交(response is committed)。于是在finally块中随着out.flush(),该response已被提交了。原因找到,解决方法同上。

IllegalStateException: Cannot forward a response that is already committed

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
异常出现的场景: (1)ssh项目,提供下载功能。项目使用tomcat部署; (2)写了一个测试类来测试下
异常出现的场景: (1)ssh项目,提供下载功能。项目使用tomcat部署; (2)写了一个测试类来测试下
以前老是有这个问题,一直没有注意,今天决定要搜下解决下,在国外的网站上看到个小窍门,分享给大
2012-12-01 09:51:29.689::WARN: Committed before 500 Unable to show problem report: java.lang.
在Fragment 中startActivity的时候 startActivity 经常会报错 06-10 19:58:21.804: E/AndroidRuntim
方法一: 2、在设置 -- SVN设置 里把里面的勾都去掉 方法二: 1.只需将上图中的Subversion configurat
本章目标 掌握response的主要使用,及对应接口定义 可以使用response设置头信息 可以使用response进
服务器启动 每一个servlet 创建一个对象 浏览器启动 每一个请求 创建 request response 对象 请求结
官方WIKI:https://github.com/simple-rtmp-server/srs/wiki/v1_CN_Forward 一、何为Forward Forwar
1.从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号