【问题标题】:Persistent cookies from a servlet in IE来自 IE 中的 servlet 的持久 cookie
【发布时间】:2010-09-26 13:11:26
【问题描述】:

我有一个从 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 中,最大年龄设置正确。我仍然不知道发生了什么。

【问题讨论】:

    标签: java internet-explorer servlets cookies


    【解决方案1】:

    我对Java或servlet一无所知,但是IE只会在cookie有过期日期的情况下持久化,设置max-age是不够的,IE会继续把它当作会话cookie。

    【讨论】:

    • 好吧,看来这就是问题所在。查看 Fiddler 中的标题,正在设置 Max-Age,但没有设置 Expires。我通过 Fiddler 修改了响应的标头,并添加了 Expires 属性,我的 cookie 被保存了。太好了——现在我只需要找到一种方法,将 Expires 属性从 Java 中实际添加到 cookie 中。
    【解决方案2】:

    一些建议。

    1. 您是否使用 fqdn 访问该站点?
    2. 使用 fiddler 检查 cookie 在 http 响应中的外观。
    3. 检查 Internet 上的其他网站是否成功存储 cookie。

    【讨论】:

      【解决方案3】:

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

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

      我的问题是一样的。我们对我们的 cookie 值进行 Base64 编码并将其发送下来。但是,Base64 包含诸如 '=' 之类的字符......这在版本 0 中也是非法的,因此 IE 无法接受。

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

      底线:对 cookie 的值进行 URI 编码将确保设置给浏览器的 cookie 是版本 0,因此被 IE 持久化。

      【讨论】:

      【解决方案4】:

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

      希望这会有所帮助...

      【讨论】:

        【解决方案5】:

        我在 IE8 上也遇到了类似的问题,只是 cookie 在使用 http 时会持续存在,但在使用 https 时不会。智力乌龟的解决方案对我有用,因为我有 '=' 和其他字符在那里搞砸了。在我对 https cookie 进行编码之前,它在“会话结束”时显示为过期。对值进行编码后,它会随着我传入的 maxAge 过期。这是我在设置之前和检索 cookie 值之前对 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;
        }
        

        【讨论】:

          【解决方案6】:
           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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-13
            • 2014-12-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多