【问题标题】:Why does the servlet API throw IllegalStateException on forwarding a request after writing to the response?为什么 servlet API 在写入响应后转发请求时会抛出 IllegalStateException?
【发布时间】:2011-01-03 05:15:54
【问题描述】:

在转发请求时出现此例外的原因是什么。 response.redirect 异常背后的原因是,在某些响应正文被刷新到输出流后,无法发出 30x 重定向响应标头。但我看不出在内部前锋身上这样做的原因。

我想到的用例是提前从过滤器中刷新 html 内容,这样浏览器就可以在顶部 css 和 javascript 上抢占先机(双关语),同时 servlet 在移交给演示文稿之前完成其后端工作jsp。通过更快地产生第一个字节,我希望看到客户端性能优势。

Struts 和其他框架依赖于前向调度。根据 API,正是由于这些转发,我们无法及早刷新响应内容。

http://download.oracle.com/javaee/6/api/javax/servlet/RequestDispatcher.html#forward(javax.servlet.ServletRequest, javax.servlet.ServletResponse)

【问题讨论】:

    标签: servlets


    【解决方案1】:

    因为,想象一下当你向浏览器发送一些<head> 定义,然后转发到一个完全不同的页面的情况。结果将是一些混乱的页面。有(也许)两个<head> 部分,其中一个是不相关的。

    您可以使用requestDispatcher.include(..) 来包含不同页面的结果,而不是转发给它。

    【讨论】:

    • 感谢您提供的好例子。通常是这种情况,转发到“不同”页面,还是您通常会转发以完成给定请求的页面?我知道你怎么可能让自己陷入困境,但它似乎不需要 IllegalStateException,因为它可能会导致完全有效的结果,这与提交案例后的重定向不同,它总是无效的。你的解释似乎很公平,虽然这条规则对我来说似乎有点过于严格
    • @Joe Hanink - servlet 容器无法确定输出是否有效。因此它总是报告一个问题。顺便看看我的更新
    • 那是真的,但不是有效或无效的原因在于转发,而是在于内容。我可以很容易地 jsp:include content 两次。我认为 servlet API 的作者在安全方面犯了错误,但似乎页面级内容控制和 http 标头完整性之间存在重大区别。似乎响应提交后响应重定向是真正的 API 级别非法状态,而包含 标记的乘法只是应用程序级别的编程错误。无论如何,感谢您的意见。这是一个很好的解释。
    猜你喜欢
    • 1970-01-01
    • 2019-11-23
    • 2021-07-19
    • 1970-01-01
    • 2012-04-23
    • 2015-08-21
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多