我在今天下午修复了一个问题之后一直在网上挖掘工作,其中添加到HttpServletResponse的Cookie没有在响应头中正确反映,因为我们的Servlet已经检索到了响应的PrintWriter(即response.getWriter( ))在我们添加cookie之前。我现在知道最佳实践要求响应头修改(即设置内容类型,添加/编辑Cookie等)必须在调用getWriter()之前完成,但是,我正在寻找的是:为什么?
我们一直在猜测为什么检索PrintWriter实际上冻结了响应标头,但为什么Servlet规范明确强制执行该操作呢?
答案 0 :(得分:13)
Java™Servlet规范版本2.4的 SRV.5.2标头
要成功传输回客户端,必须先设置标头 响应已提交。提交响应后设置的标头将是 被servlet容器忽略。
因此规范没有明确提及getWriter()
对设置标题有影响。
但是,您的servlet容器实现可能已选择将响应视为在调用getWriter()
后进行了调用。这略有不同。
在我与之合作过的某些容器中,当您在响应被评估后尝试设置标题时,会收到警告。
总是值得尽可能晚地调用getWriter()
,因为您可能希望有机会设置字符编码等,必须在调用getWriter()
之前设置。
答案 1 :(得分:3)
因为标头位于HTTP的正文之前。这就是为什么他们被称为'标题'。如果你调用getWriter(),你正在写入正文,那么之后开始更改响应头值为时已晚。