今天下午修复了一个问题后,我一直在网上进行挖掘,其中添加到 HttpServletResponse 的 Cookie 没有正确反映在响应标头中,因为我们的 Servlet 之前已经检索了响应的 PrintWriter(即 response.getWriter())我们添加了cookie。我现在知道,最佳实践规定必须在调用 getWriter() 之前完成响应标头修改(即设置内容类型、添加/编辑 Cookie 等),但是,我要查找的是:为什么?
我们一直在猜测为什么检索 PrintWriter 实际上会冻结响应标头,但为什么 Servlet 规范明确强制执行这一点?
Section SRV.5.2 标头 of the Java™ Servlet 规范版本 2.4
为了成功传回客户端,必须在之前设置标头
响应已提交。提交响应后设置的标头将是
被 servlet 容器忽略。
所以规范中没有明确提到getWriter()
对设置标题有影响。
然而,您的 servlet 容器实现可能选择将响应视为已提交一次getWriter()
叫做。这是有微妙的不同的。
在我使用过的一些容器中,当您在提交响应后尝试设置标头时,会收到一条警告记录。
永远值得打电话getWriter()
尽可能晚,因为您可能希望有机会设置字符编码等,这些必须在之前设置getWriter()
叫做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)