当使用response.addCookie时,如何阻止Jetty更改HTTP Expires标头?

4
在Jetty中,当你添加一个cookie时,它不仅会将cookie添加到HTTP响应头中,还会改变Expires HTTP头的值!
((HttpServletResponse)response).addCookie(cookie);

我需要Jetty停止对正确/适当的到期设置进行搞弄。
另外,它行为异常的一个特别/好理由是什么?我猜测Jetty认为如果已经设置了cookie,则内容始终是动态的,因此应该将其设置为过期以使其不被缓存。
更新:使用Jetty 8.1.8.v20121106进行测试。

如果您先添加Cookie,然后设置过期时间,Jetty是否仍会对其进行处理? - ZhongYu
你使用的Jetty版本是什么? - Perception
呃!我本想添加Jetty版本,但是忘记了,我正在使用的是截至上个月最新的版本(Jetty 8.1.8.v20121106)。我应该检查是否有更新的发行版(我迫不及待地想知道9什么时候发布)。 - Jay
Eclipse网站列出了版本9是稳定版。 - asgs
似乎在添加了Cookie之后,您无法重新调整标头。 - Jay
似乎最近几天9已经稳定了。不过我没有看到任何关于此的公告。请参考http://download.eclipse.org/jetty/。 - Jay
1个回答

6
我刚刚浏览了 Jetty 8 代码库。以下是代码库中强制将 Expires(作为 HTTP 响应头)设置为某个值或在存在时删除的情况。
  • 任何 HTTP 206 响应(根据 RFC2616 规范强制删除)
  • 使用 org.eclipse.jetty.server.handler.MovedContextHandler(如果未设置则强制设置)
  • 在表单身份验证期间,如果需要通过 Dispatch 处理响应错误(强制删除)
  • 在表单身份验证挑战响应期间(强制删除)
这就是 Expires 作为 HTTP 响应头的全部内容。
但是,由于您指出这是 .addCookie() 的一部分,我想指出,在响应的 Set-Cookie 逻辑中,还有一个 Cookie 规范 Expires 头,作为 Cookie 值字符串的一部分。

如果Cookie.setMaxAge()的值为0或更大,则会强制使用Cookie Expires头部。这是为了解决各种浏览器错误,这些错误在Cookie值上没有提供Expires=时不遵守Max-Age=

Cookie的默认行为:

  • Cookie.setMaxAge(-1);将禁用Max-Age=Expires=
  • Cookie.setMaxAge(0);将导致Expires=1970年1月1日UTC时间00:00:00(Unix纪元开始)
  • Cookie.setMaxAge(60000);将导致Expires=未来1分钟。

版本1 Cookie行为(又称Cookie.setVersion(1)):

  • Cookie.setMaxAge(-1); 将禁用 Max-Age=Expires=
  • Cookie.setMaxAge(0); 将导致 Max-Age=0Expires=1970年1月1日00:00:00 UTC(unix纪元开始时刻)
  • Cookie.setMaxAge(60000); 将导致 Max-Age=60000 和一个 Expires= 在未来1分钟。

太棒了!我以为会有一些怪癖导致这种行为被内置。希望我能给你更多的赞(: - Jay
2
不是以秒为单位吗?例如,60000将是1000分钟,而不是1分钟? - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接