1

我设置了一个 servlet 过滤器来处理各种进入我的网站的方式。过滤器的一个目标是在输入时设置一个 cookie。下面的代码在 Chrome、Safari 和 Firefox 中完美运行,但 IE 似乎不喜欢它。由于某些限制,我无法使用 JavaScript 设置 cookie。

Cookie cookie = new Cookie(COOKIE_NAME, COOKIE_VALUE);
cookie.setPath("/"); //Note: I've tried removing this.
cookie.setDomain(SITE_DOMAIN); //Note: I've tried removing this.
response.addCookie(cookie);

我尝试了最大年龄和到期日期的不同组合,但似乎没有任何效果。我已经调试了一个调试器,我确定代码正在执行。

此外,作为记录,我使用的是 Tomcat 6。Cookie 名称和值都是大约 10 个字符长度的字符串。

4

2 回答 2

2

当 cookie 值包含版本 0 cookie的非法字符(例如空格)时,就会发生这种情况。有了这样的 cookie 值,一般容器会自动切换到IE9 或更早版本不支持的版本 1 cookie 。

您需要确保 cookie 值不包含版本 0 cookie 的非法字符。这在Cookie#setValue()javadoc 中指定如下:

对于版本 0 cookie,值不应包含空格、方括号、圆括号、等号、逗号、双引号、斜杠、问号、at 符号、冒号和分号。空值在所有浏览器上的行为方式可能不同。

如果您无法控制实际的 cookie 值,那么最好的选择是URLEncode在设置之前和URLDecode检索期间进行。

也可以看看:

于 2012-12-21T05:09:34.877 回答
1

这实际上是由重定向问题引起的。我正在通过单击按钮重定向页面

window.location = url;

由于某种原因,这导致 IE 向服务器发出两个请求,根据 Fiddler 的说法,第一个请求被中止。服务器仍然尝试处理第一个请求并设置 cookie,但由于请求被中止,浏览器从未设置 cookie。后续请求假定 cookie 已经设置并且不尝试设置它。

快速解决方法是提交包含数据的表单,而不是将其添加到 URL 的查询字符串并使用 javascript 重定向。

我仍然不确定为什么 IE 会发出重复请求,我猜这是 javascript 可能被调用两次或什么的问题。

于 2012-12-21T19:41:46.197 回答