来自IE中的servlet的持久性cookie

时间:2008-12-11 22:26:47

标签: java internet-explorer servlets cookies

我有一个从servlet生成的cookie,我希望它是持久的 - 也就是说,设置cookie,关闭IE,重新启动它,并且仍然能够读取cookie。我正在使用的代码如下:

HttpServletResponse response = 
    (HttpServletResponse) FacesContext.getCurrentInstance()
    .getExternalContext().getResponse();

Cookie cookie = new Cookie("someKey", "someValue");
cookie.setMaxAge(7 * 24 * 60 * 60);
response.addCookie(cookie);

这在firefox中运行良好,但在IE 6/7中,浏览器重启之间不会保存cookie。我已经检查了我在设置中可以想到的所有内容,但无法弄清楚导致cookie被删除的原因。据我所知,使用正数调用setMaxAge会使cookie持久化。任何想法为什么会出错?

修改

我已经使用Olaf建议的更多信息技巧验证了cookie是否正在尝试设置为会话cookie,而不是持久性cookie;最大年龄设置为“会话结束”。所以似乎并没有为IE设置最大年龄 - 我已经验证在Firefox中,最大年龄设置正确。我仍然不知道发生了什么。

6 个答案:

答案 0 :(得分:6)

我对Java或servlet一无所知,但IE只会持有一个cookie,如果它有一个Expires日期,设置max-age是不够的,IE将继续将其视为会话cookie。

答案 1 :(得分:1)

很少有建议。

  1. 您使用fqdn访问该网站吗?
  2. 使用fiddler检查Cookie在http响应中的显示方式。
  3. 检查互联网上的其他网站是否成功存储了Cookie。

答案 2 :(得分:1)

这个http://www.mail-archive.com/users@tomcat.apache.org/msg52249.html有答案,但并没有真正解释原因。

也就是说,通过编码@(这是版本0 cookie中不可接受的字符),响应中发送的cookie将其版本设置为0(IE可接受)而不是1(不同的格式,因此不可接受的IE)

我的问题就是这样。我们使用Base64编码我们的cookie值并将其发送下来。但是,Base64包含像'='这样的字符......在版本0中再次是非法的,因此对IE来说是不可接受的。

对我来说仍然存在的谜团是:堆栈的某些部分是“智能”的,足以识别cookie值作为版本0 cookie无效并决定将响应作为版本1 cookie发送(包括显式版本)数字,“不可接受的”字符,max-age而不是expires字段等。)我不知道是否是Tomcat,Faces,Spring或javax.servlet决定翻转版本。

底线:对cookie值进行URI编码将确保设置为浏览器的cookie为版本0,因此IE会保留。

答案 3 :(得分:0)

由于我不使用Windows,这是一些晕倒的内存:如果你每次设置cookie时将IE cookie设置设置为“请求权限” - 它不会显示cookie应该有效多长时间?此外,您可能希望将该站点添加到另一个安全区域(本地或任何被调用的区域)以获得完全不同的设置,然后再试一次。

希望这会有所帮助......

答案 4 :(得分:0)

我也遇到过与IE8类似的问题,除了使用http时cookie仍然存在但使用https时没有。 Intellectual Tortoise的解决方案对我有用,因为我有'='和那里的其他字符搞砸了。在我编码https cookie之前,它在“会话结束”时显示为到期。在对值进行编码之后,它已经过了我传入的maxAge。这是我在设置之前和检索之后用来编码/解码cookie值的方法:

public static String encodeString(String s) {
    String encodedString = s;

    try{
        encodedString = URLEncoder.encode(s, "UTF-8");
    } catch (UnsupportedEncodingException e) {}

    return encodedString;
}
public static String decodeString(String s) {
    String decodedString = s;

    try{
        decodedString = URLDecoder.decode(s, "UTF-8");
    } catch (UnsupportedEncodingException e) {}

    return decodedString;
}

答案 5 :(得分:0)

 try{
        encodedString = URLEncoder.encode(s, "UTF-8");
    } catch (UnsupportedEncodingException e) {}

    return encodedString;`a`
}
public static String decodeString(String s) {
    String decodedString = s;

    try{
        decodedString = URLDecoder.decode(s, "UTF-8");
    } catch (UnsupportedEncodingException e) {}

    return decodedString;
}