Java Cookie.setMaxAge(0)的行为是实现还是有规范?

时间:2012-02-18 18:19:20

标签: java java-ee tomcat

我有一个在旧的修改过的Tomcat安装上运行的Web应用程序。为了在注销后删除会话cookie,我有以下代码:

Cookie sessionCookie = new Cookie("session",null);
sessionCookie.setMaxAge(0);
response.addCookie(sessionCookie);

在我的网络应用程序中,我遇到的问题是它将当前时间作为cookie的过期部分返回:

Set-Cookie: sesssion=null; Expires=Sat, 18-Feb-2012 18:04:52 GMT

问题是它只需要客户端的PC稍微落后于服务器就可以继续发送cookie!

但是,在Tomcat 5.5中,它返回:

Set-Cookie: session=null; Expires=Thu, 01-Jan-1970 00:00:10 GMT

这是更理想的行为。

我的问题是正确的,是否有关于如何实施的官方指南,文档只是声明:

  

零值会导致cookie被删除。

也许我必须自己添加Set-Cookie:标头来解决这个问题?

2 个答案:

答案 0 :(得分:1)

规范中似乎没有任何关于该方法实现的具体内容。

但是,您永远不应该依赖浏览器立即删除cookie,您甚至不应该依赖浏览器删除cookie,因为从服务器上您根本无法控制客户端行为。

你在那个cookie中存储了什么,你能简单地使用已经由容器管理的会话吗?

当您在服务器上使会话无效时,即使cookie保留在浏览器上也没关系,因为它将在服务器端失效,并且cookie中的会话ID将不再与现有会话匹配,并且对象是绑定到该会话将被销毁。

答案 1 :(得分:0)

如果过期时间< =当前时间,浏览器将过期cookie。

如果您是手动操作,大多数人会返回0个纪元(这是您在tomcat 5.5中看到的)或者至少是当前时间减去一些时间来计算时钟漂移。话虽这么说,你永远不能说最终用户的计算机时钟完全被淹没。

即使是tomcat 5.5也是旧软件。它的EOL是今年9月(2012年)。听起来你的问题是你正在运行一个尚未升级或维护的古老版本的tomcat(或java)。有时你必须升级。