为什么在调用getWriter()之后不能更新HttpServletResponse标头?

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

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

部分SRV.5.2 Java™Servlet规范版本2.4的 标题

要成功传输回客户端,必须在提交响应之前设置标头。 servlet容器将忽略响应提交后设置的标头。

因此规范没有明确提到getWriter()对设置标头有影响。

但是,一旦调用了getWriter() ,您的servlet容器实现可能已经选择将响应视为已经被调用。 这略有不同。

在我与之合作的一些容器中,当您在响应被调整后尝试设置标题时,会收到警告。

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

因为标头位于HTTP的正文之前。 这就是为什么他们被称为’标题’。 如果你调用getWriter(),你正在写入正文,那么之后开始更改响应头值是为时已晚。