【问题标题】:Servlet include swallows HTTP headers in TomcatServlet 包含在 Tomcat 中吞下 HTTP 标头
【发布时间】:2010-10-01 19:44:45
【问题描述】:

我有一个 servlet,它的请求调度程序包含另一个 servlet。

包含的 servlet 设置我想在 包括 servlet 中读取的标题。因此,我在 include() 方法中传入了一个自定义 HTTPResponse 对象,该方法捕获来自 servlet 的所有反馈活动。

问题是我的自定义响应中没有设置标题。我已经在调试中运行并检查了 Tomcat 用它自己的响应对象包装我的自定义响应对象的样子。 setHeader 调用转到此包装类,并且永远不会传播到我的自定义响应对象。

我想 Tomcat 这样做是为了保护客户端不将标头设置在错误的位置。有趣的是,同样的方法在 Jetty 中的工作方式是我所期望的。

自从我认真地完成 Servlet 以来已经有一段时间了,所以我在这里有点挣扎。我试图弄清楚如何从通过 dispatcher.include() 调用的 servlet 中读取响应标头。

【问题讨论】:

    标签: java tomcat servlets


    【解决方案1】:

    来自 Servlet 规范部分 SRV.8.3:

    RequestDispatcher 接口的include 方法可以随时调用。 include 方法的目标 servlet 可以访问请求的所有方面 对象,但它对响应对象的使用受到更多限制。

    它只能将信息写入到 ServletOutputStream 或 Writer 的 响应对象并通过在末尾写入内容来提交响应 响应缓冲区,或显式调用 ServletResponse 接口。

    它不能设置标题或调用任何影响 响应的标头。任何这样做的尝试 必须忽略

    如何在请求范围内设置调用 servlet 的值,使用 request.setAttribute(...),然后在返回后从那里读取它?这行得通吗?

    【讨论】:

    • 感谢您为我澄清行为。你知道我考虑过使用 request.setAttribute()。那会奏效,我将其保留为 B 计划,因为它在 D.R.Y. 的意义上不是最佳的。我需要访问内容类型和内容长度以传播到包含的 servlet。使用请求属性会强制冗余。不过,包含的 servlet 需要重构。再次感谢!
    • 如果我将我的 include servlet 转换为过滤器,那会起作用吗?我的意思是在过滤器调用的 servlet 中写入标头是否违反规范?
    • +1 正确。我已经在 WildFly Full 9.0.1.FinalApache Tomcat/6.0.29Apache Tomcat/7.0.47 i>Jetty-9.3.3.v20150827,并且其中任何一个都无法更改包含响应中的标头(如预期的那样)。自从这个问题发布以来已经很长时间了,所以这里没有惊喜。我只是想仔细检查一下。
    • 顺便说一句,“如何在请求范围内设置调用 servlet 的值 [...]”...... jsp,这也有效。
    • 但是为了记录,我也用一个更大的jsp进行了测试,显然改变响应只有在它还没有提交的情况下才有效。这可以解释它:stackoverflow.com/a/2030908/413020
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2016-11-07
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多