我设置了一个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个字符长度的字符串。
答案 0 :(得分:2)
当cookie值包含version 0 cookies的非法字符(例如空格)时,就会发生这种情况。使用这样的cookie值,平均容器将自动切换到version 1 cookies,IE9或更早版本不支持。
您需要确保Cookie值不包含版本0 Cookie的非法字符。这在Cookie#setValue()
javadoc中指定如下:
对于版本0的cookie,值不应包含空格,括号,括号,等号,逗号,双引号,斜杠,问号,符号,冒号和分号。空值在所有浏览器上的行为可能不同。
如果您无法控制实际的Cookie值,那么您最好在设置之前URLEncode
,并在检索期间URLDecode
。
答案 1 :(得分:1)
这实际上是由重定向问题引起的。我点击按钮
重定向页面window.location = url;
由于某种原因,这导致IE向服务器发出两个请求,第一个请求根据Fiddler中止。服务器仍尝试处理第一个请求并设置cookie,但由于请求被中止,浏览器从不设置cookie。后续请求假定cookie已经设置,并且不会尝试设置它。
快速解决方法是提交包含数据的表单,而不是将其添加到URL的查询字符串中,并使用javascript重定向。
我仍然不确定为什么IE会发出重复请求,我猜这是一个问题,javascript可能会被调用两次或者什么。