【问题标题】:include jsp page with error redirects from servlet包含来自 servlet 的带有错误重定向的 jsp 页面
【发布时间】:2011-01-06 22:37:39
【问题描述】:

我正在尝试从 servlet 中包含一个 jsp 页面:

  RequestDispatcher rd = ctx.getRequestDispatcher( jspPage );
  rd.include( req, wrapper );   

但我得到以下异常:

java.lang.IllegalStateException: Cannot forward after response has been committed

问题在于通过 JSP 错误标记指定其自己的默认错误页面的 JSP 页面。 JSP 错误页面也可以抛出一个异常,该异常会一直传播到 web.xml 中指定的应用程序级错误页面。因此,当我尝试包含的 jsp 页面抛出异常,并且错误页面也抛出异常时,包含失败。

我必须优雅地处理这种情况,因为我在页面上包含用户编写的模块,并且错误的模块应该向用户显示异常,而不是使用 IllegalStateException 进行轰炸。有什么想法吗?

【问题讨论】:

    标签: java jsp servlets


    【解决方案1】:

    正如您在 previous question 中的评论中所暗示的那样,更改回复只是为时已晚。在响应中的字节数为 X 之后,响应标头将提交给客户端,这是一个不归路。您需要重写您的 JSP。它们应该只包含标记和表示逻辑,而不是任何可能引发异常的业务逻辑。

    如果您真的无法将 JSP 中的错误业务代码重构为完全有价值的 servlet/业务类,那么您最好的选择是增加服务器配置中的 HTTP 响应缓冲区大小,并祈祷无处可去flush() 被调用之前 JSP 中发生异常,当它忙于您的 web 应用程序时,您不会遇到 OutOfMemoryError 失败。

    相关问题:

    【讨论】:

    • 就像我之前提到的,我无法重写我的 JSP,因为它们是用户提交的,我只是在编写应用程序以将它们全部作为模块包含在一个页面上。我希望有一种解决方法,我可以创建一个模拟响应并尝试先在那里提交,如果没有例外,然后包含到实际响应中??
    • 因此,增加响应缓冲区大小并为您的服务器提供足够的 RAM。然而,我仍然会重新考虑设计,以便在将请求转发到 JSP 视图之前处理“模块”。然而,这需要一种完全不同的“模块”设置方法。
    • 是的,我认为这是我想要弄清楚的,如何在将 jsps 提交到响应之前对其进行预处理。你能分享一下这样做的策略吗?
    • 不要让它们成为 JSP,而只是像 UBB 或纯 EL 之类的东西。
    • 好的,感谢您的意见。我真的希望有一种简单的方法来创建响应的假副本,并尝试首先包含到那里以确保没有抛出异常。
    【解决方案2】:

    您可以尝试将用户的浏览器重定向到错误页面吗?您可能需要保存要在会话中显示给用户的任何错误信息,以便错误页面可以显示它。

    唯一的问题是写入重定向消息可能会失败,因为内容已经从错误的“页面”传递。不确定它是否非常防弹:)

    增加缓冲区大小可能会使其在更多页面上工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      相关资源
      最近更新 更多