为什么在调用getWriter()之后不能更新HttpServletResponse标头? [英] Why can't HttpServletResponse Headers be updated AFTER getWriter() is called?

查看:232
本文介绍了为什么在调用getWriter()之后不能更新HttpServletResponse标头?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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

解决方案

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



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



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



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



在我使用过的一些容器中,当你在响应被调整后尝试设置标题时,会收到警告。 / p>

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


I've been digging around the web after fixing an issue this afternoon @ work where Cookies added to the HttpServletResponse weren't being properly reflected in the response headers because our Servlet had already retrieved the response's PrintWriter (i.e. response.getWriter()) before we added the cookies. I'm now aware that best practices dictate that response header modifications (i.e. setting content type, adding/editing Cookies, etc.) must be done prior to a call to getWriter() but, what I'm looking for is: Why?

We've been speculating about why retrieving the PrintWriter in effect freezes the response headers but why definitively does the Servlet specification enforce that?

解决方案

Section SRV.5.2 Headers of the Java™ Servlet Specification Version 2.4

To be successfully transmitted back to the client, headers must be set before the response is committed. Headers set after the response is committed will be ignored by the servlet container.

So the spec doesn't explicitly mention getWriter() having an effect on setting headers.

However, your servlet container implementation may have chosen to treat the response as having been comitted once getWriter() is called. That is subtly different.

In some of the containers I've worked with you get a warning logged when you attempt to set a header after the response has been comitted.

It is always worth calling getWriter() as late as possible, as you may want the opportunity to set the character encoding, etc, which must be set before getWriter() is called.

这篇关于为什么在调用getWriter()之后不能更新HttpServletResponse标头?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆