【问题标题】:Repeated "java.lang.IllegalStateException: Cannot forward after response has been committed" errors with Grails and TomcatGrails 和 Tomcat 重复出现“java.lang.IllegalStateException:提交响应后无法转发”错误
【发布时间】:2012-04-02 22:39:19
【问题描述】:

请在 Grails 用户邮件列表中查看我的 post。本质上,每隔几个请求后,我就会在 Grails 2.x 中收到错误“提交响应后无法转发”。所有类型的 URL、控制器、GSP、CSS 文件、JS 文件甚至图像文件都会发生这种情况。我已经在 Windows XP 32 位、Windows 7 32 位和 Centos 64 位上尝试了 Grails 2.0.0 和 Grails 2.0.1 以及 Tomcat 6.0.35 和 Tomcat 7.0.25。所有这些组合都会出现错误。

正如我在post 中提到的,我们的代码中没有 response.redirect 或 response.forward 语句。这对我们的生产应用程序造成了严重的问题,因此需要帮助来确定可以查看的其他内容以找出问题的根源。

【问题讨论】:

    标签: grails grails-2.0


    【解决方案1】:

    这个问题已经解决了。在应用程序的其中一个控制器中,响应输出流被直接写入,但在操作结束后没有显式关闭。似乎 Tomcat 和 Jetty 回收响应对象。当之前没有关闭其输出流的响应对象被回收以用于将来的请求并对其执行重定向时,重定向将失败。

    代码已更改,错误现已消失。吸取的教训是,每当发生此类错误时,扫描整个代码库以直接访问响应输出流,并在现有控制器方法之前负责任地关闭输出流。

    【讨论】:

    • 关闭前是只有 response.outputStream.close() 还是 response.outputStream.flush()?
    • 不,不在我们的应用程序中。我们的代码类似于: final stream = response.getOutputStream();尝试 { ... stream.outputFlush(); } 最后 { if(stream != null) { stream.close(); } }
    【解决方案2】:

    您应该创建一个新的 grails 应用程序并自己移动控制器、域等,而不是 grails 更新。

    当你这样做时,还要确保你查看了 grails 的配置文件。

    也看看你有什么插件。

    此外,在移动文件时,如果可能,请不时尝试一下该应用程序,也许您可​​以检测到何时出现错误。首先在您最基本的控制器中尝试它,然后查看错误是否存在。

    祝你好运。

    【讨论】:

    • 感谢 Hamidam,但我已经完成了所有这些工作,但无济于事。
    • 那么我建议您回滚到之前的版本,并在几个月后重试。您永远不应该跳上向社区发布新版本的马车。未经测试的软件中总是存在错误。给它一些时间,最关键的问题应该已经解决了。如果您还没有提交 JIRA,请同时为您的案例提交一份 JIRA。祝你好运!
    • 谢谢哈米达姆。降级是我开始的。 :)
    猜你喜欢
    • 2013-09-15
    • 2011-12-18
    • 2016-03-08
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2014-04-27
    • 1970-01-01
    相关资源
    最近更新 更多