即不接受Tomcat Servlet过滤器中的cookie



我设置了一个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个字符长度的字符串。

当cookie值包含版本0 cookie的非法字符(例如白空间)时,会发生。使用这样的cookie值,普通容器将自动切换到1 cookie,IE9或以上不支持。

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

使用0版Cookie,值不应包含空白,括号,括号,等于标志,逗号,双引号,斜线,问号,在标志,结肠和分号。在所有浏览器上,空值可能不会以相同的方式行为。

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

另请参见:

  • 为什么带有空格的cookie值以引号到达客户端?

这实际上是由重定向问题引起的。我在单击一个带有

的按钮时将页面重定向
window.location = url;

由于某种原因,这导致IE向服务器提出了两个请求,该请求是根据提示器的。服务器仍在尝试处理第一个请求并设置cookie,但是由于该请求已中止,因此浏览器从未设置cookie。随后的请求假定cookie已经设置并且没有尝试设置。

快速工作是提交带有数据的表单,而不是将其添加到URL的查询字符串中,并使用JavaScript重定向。

我仍然不确定IE为什么要进行重复请求,我猜这是JavaScript可能被称为两次或其他东西的问题。

最新更新