一尘不染

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

tomcat

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

我们一直在思考为什么检索PrintWriter实际上会冻结响应标头,但是为什么Servlet规范一定要强制执行该响应?


阅读 296

收藏
2020-06-16

共1个答案

一尘不染

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

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

因此,规范未明确提及getWriter()对设置标头有影响。

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

在您使用过的某些容器中,在响应提交后尝试设置标头时,会记录一条警告。

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

2020-06-16