2009-09-10 47 views
0

我正在与Apache Tomcat上6.0.20一个问题,即一旦它被添加到响应我不能改变一个cookie的值。基本上,我试图使用cookie复制会话功能。我有一个自定义的“会话”对象,它由一个cookie支持。当我创建我的Session时,我将它传递给一个HttpServletResponse,并创建并向响应添加一个空的cookie。然后,当我的代码调用Session.put()方法时,我想更改此cookie的值。Tomcat:1次请求多次设置cookie值?

我所看到的是,一旦该cookie已被添加到响应,以Cookie.setValue任何电话()是基本没用。使用调试器,我可以看到cookie本身正在被修改,但响应对象中的Set-Cookie头保持不变(它包含cookie的初始值,通常只是一个空字符串)。我甚至尝试创建一个新的cookie并将其重新添加到响应中,但这对Set-Cookie头也没有影响。

奇怪的是我用写在几年前由我们自己开发的库。在过去,我们使用JRun 3.1 Web服务器,所以我猜可能每个Web服务器都以不同的方式处理这些Cookie操作。

有没有人遇到过这个问题?我现在唯一能够保证工作的解决方案是不会将cookie添加到响应中,直到我确定完成了自定义Session对象。我可以创建一个名为Session.saveTo(HttpServletResponse)的方法,它将cookie添加到响应中。这有效,但我们的一些JSP可能非常复杂,所以我宁愿让Session“自动保存”在每次放置时都会忘记调用Session.saveTo()。

为了澄清,这是我在做什么有效:

Cookie cookie = new Cookie("custom-session", "initial"); 
response.addCookie(cookie); // Set-Cookie header has 'custom-session=initial' 

cookie.setValue("new value"); // does not change Set-Cookie header 
response.addCookie(cookie); // re-adding the same cookie, does not work either 

了这一切后,我的浏览器创建一个cookie,其中定制会话“inital”,不到最后,我设定值。

+0

什么版本的Tomcat? – 2009-09-10 13:57:21

+0

看起来像Apache Tomcat/6.0.20 – 2009-09-10 14:02:49

回答

1

它原来是在Tomcat中6我们旧的Web服务器,的JRun 3.1中的错误/设计的功能,直到响应COMMITED没有创建的Set-Cookie响应头。这意味着您可以在此之前随时修改所有您想要的cookies。但是,在查看源代码时,只要将Cookie添加到响应中,Tomcat就会创建Set-Cookie标头。 Tomcat Response对象保留了Cookie对象的句柄,但对它们没有任何作用。

对于Tomcat,只要你添加一个cookie来响应,也没有办法去改变它。

1

您的自定义Session应该在内部举行的cookie,只把它传递到返回到Tomcat权前的响应。

+0

是的,这是我现在要解决的解决方案。从长远来看,我认为更好的解决方案可能会坚持使用HttpSession并配置Tomcat的会话群集,以便我们的应用可以扩展到多个服务器。 – 2009-09-10 17:49:05