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

时间:2012-02-29 23:40:20

标签: java java-ee web-applications tomcat

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

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

2 个答案:

答案 0 :(得分:13)

Java™Servlet规范版本2.4的 SRV.5.2标头

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

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

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

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

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

答案 1 :(得分:3)

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