【问题标题】:Why can't HttpServletResponse Headers be updated AFTER getWriter() is called?为什么调用 getWriter() 后不能更新 HttpServletResponse 标头?
【发布时间】:2012-03-19 11:44:37
【问题描述】:

今天下午修复了一个问题后,我一直在网上挖掘@工作中添加到 HttpServletResponse 的 Cookie 没有正确反映在响应标头中,因为我们的 Servlet 已经检索到响应的 PrintWriter(即 response.getWriter( )) 在我们添加 cookie 之前。我现在知道最佳实践规定必须在调用 getWriter() 之前完成响应标头修改(即设置内容类型、添加/编辑 Cookie 等),但是,我正在寻找的是:为什么?

我们一直在猜测,为什么检索 PrintWriter 实际上会冻结响应标头,但为什么 Servlet 规范明确地强制执行这一点?

【问题讨论】:

    标签: java jakarta-ee web-applications tomcat


    【解决方案1】:
    Java™ Servlet 规范版本 2.4

    SRV.5.2 标头部分

    要成功传回客户端,必须先设置headers 响应已提交。提交响应后设置的标头将是 被 servlet 容器忽略。

    所以规范没有明确提到getWriter() 对设置标题有影响。

    但是,您的 servlet 容器实现可能已选择在调用 getWriter() 后将响应视为已提交。那是微妙的不同。

    在我与您合作过的一些容器中,当您在响应提交后尝试设置标头时会收到一条警告。

    尽可能晚地调用getWriter() 总是值得的,因为您可能希望有机会设置字符编码等,这些必须在调用getWriter() 之前设置。

    【讨论】:

    • 谢谢保罗!这就说得通了。因此,Tomcat 可能过于热衷于何时考虑关闭标题以进行修改。我的错误是假设我们在调用 out.flush() 之前写入响应正文的任何​​数据基本上都是未提交的,但情况可能并非如此。再次感谢!
    • 可爱的答案,很好的参考。谢谢保罗。
    【解决方案2】:

    因为在 HTTP 中标头在正文之前。这就是为什么它们被称为“标题”。如果您调用 getWriter() 您正在写入正文,因此之后开始更改响应标头值为时已晚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多