`
Cwind
  • 浏览: 265864 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
793bb7df-a2a9-312d-8cb8-b66c3af482d1
LeetCode题解
浏览量:53715
社区版块
存档分类
最新评论

IllegalStateException: Cannot forward a response that is already committed

阅读更多
对于初学者来说,一个常见的误解是:当调用 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已被提交了。原因找到,解决方法同上。
1
0
分享到:
评论

相关推荐

    java.lang.IllegalStateException: Cannot call sendError() after the response has

    在Java的Web开发中,`java.lang.IllegalStateException: Cannot call sendError() after the response has been committed` 是一个常见的错误,通常发生在尝试在HTTP响应已经发送到客户端之后调用`sendError()`方法...

    关于IllegalStateException: The specified child already has a parent.

    IllegalStateException: The specified child already has a parent.我的博客中有文章讲解

    java.lang.IllegalStateException: getOutputStream() has already解决办法

    纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....

    java.lang.IllegalStateException: OutputStream already obtain

    标题 "java.lang.IllegalStateException: OutputStream already obtain" 涉及到的是Java编程中的一个常见错误,特别是当处理I/O流时。这个异常通常在尝试获取已经存在的OutputStream实例时抛出,表明该输出流已经被...

    Java异常之—-Caused by: java.lang.IllegalStateException: Method has too many Body parameters

    1、错误信息 异常:Caused by: java.lang....Caused by: java.lang.IllegalStateException: Method has too many Body parameters: public abstract com.iot.framework.core.response.CommResponse ...

    ListView后台更新报错:java.lang.IllegalStateException

    java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but...

    Android异常 java.lang.IllegalStateException解决方法

    2. `java.lang.IllegalStateException: Adapter is detached.` 这个异常通常与Android的ListView或者RecyclerView的Adapter有关。当试图在Adapter与列表视图分离后(即未绑定到任何视图)更新Adapter数据时,会抛出...

    spring入门好教程

    《Spring框架:开启Java开发新纪元》 Spring框架,由Rod Johnson创立并由Interface21公司推广,自诞生以来,它就致力于简化Java企业级应用(J2EE)的开发,提供了一种非侵入式的解决方案,极大地提高了开发效率。...

    action-buffer:提供了在处理后台任务时避免片段过渡期间出现 IllegalStateException 的示例

    这个存储库提供了一种在处理片段传输和后台任务时避免“java.lang.IllegalStateException:Can not perform this action after onSaveInstanceState”的方法。 您可以在的非常权威的阅读有关该问题和可能的解决方案...

    asm5.0.jar

    Cause: java.lang.IllegalStateException: Cannot enable lazy loading because CGLIB is not available. Add CGLIB to your classpath.:java.lang.IncompatibleClassChangeError: class ...

    powerbuilder

    ### PowerBuilder 中从 Excel 导入数据到 DataWindow 的实现方法 #### 标题解析: 在 PowerBuilder 开发环境中,经常需要将外部数据源(如 Excel 文件)中的数据导入到程序内部的数据展示组件(DataWindow)中进行...

    xfire访问webservice客户端用到的jar包

    在Java开发中,Web服务(Web Service)是一种标准的接口,允许不同系统之间进行通信,而XFire是早年流行的一款用于构建和消费Web服务的开源框架。它使用SOAP(简单对象访问协议)和XML(可扩展标记语言)作为基础,...

    For gd&t not affected - when to revise dwg guidelines 3-21-02.ppt

    3. **判断标准**:描述中的“GUIDELINES TO DETERMINE IF A DRAWING NEEDS TO BE UPDATED WHEN GD&T IS NOT AFFECTED BY ENGINEERING CHANGE”是指一套规则,用于确定在不涉及GD&T的工程变更下,是否仍需更新图纸。...

    Jnative1.4_java调用动态库所需jar

    native int add(int a, int b); static { System.loadLibrary("mylib"); // 加载动态库 } } ``` `add`方法是本地方法,`System.loadLibrary`用于加载名为`mylib`的动态库。 3. **编译JNI头文件**: 使用`...

    oop object , for apple ios developer

    NSLog(@"Hello, my name is %@", self.name); } @end ``` 2. **实例化对象**: ```objective-c ClassName *object = [[ClassName alloc] init]; object.name = @"John Doe"; [object sayHello]; ``` 3....

    JSP三种跳转方式 超级好的范例

    java.lang.IllegalStateException: forward() not allowed after buffer has committed. ``` 解决办法同样是确保在使用`<jsp:forward>`之前没有任何输出。 ### 总结 以上介绍了JSP中的三种页面跳转方式:`response...

    jacob使用说明终极吐血版

    **Jacob使用说明终极吐血版** ... ## 1.... ...JNI允许Java代码调用本地(Native)代码,也就是非Java语言编写的代码,如C++或C。...## 2....首先,你需要下载Jacob的JAR文件和相应的DLL库。DLL库根据你的操作系统位数(32位或64...

    Failed to convert value of type ‘java.lang.String’ to required type ‘java.util.Date’; nested except

    Type 异常报告 消息 Failed to convert ... nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.util.Date': no matching editors or co

    小结jsp页面跳转问题

    - 这里可能会出现`java.lang.IllegalStateException: Attempt to clear a buffer that's already been flushed`异常,原因是缓冲区已满,而`<jsp:forward>`试图清空缓冲区。 3. **尝试在缓冲区非常大时使用`<jsp:...

Global site tag (gtag.js) - Google Analytics