1

我做了一个登录页面。当用户登录时,向 API 发送请求。此 API 是 PHP 并检查用户名和密码。当两者都正确时,将发送回唯一密钥(将其放置在数据库中以供进一步使用:用户 ID 和网站所需的其他内容)。在该密钥被发回后,它被放置在一个 cookie 中:

$.cookie("session", JSON.stringify(result));

设置 cookie 后,我将用户发送到新页面:

location.href = 'dashboard.htm';

在此页面中,jQuery 检查 cookie “会话”是否存在。如果不是,则将用户发送回登录页面。

sessionId = ($.cookie("session") ? JSON.parse($.cookie("session")).SessionId : 0);
return sessionId;

这在 Chrome 中运行良好,但 IE (8/9) 对此有一些问题。我发现当您访问dashboard.htm 时,会话就存在了。我一按 F5,会话就消失了。有时cookie根本没有设置!

我似乎无法弄清楚为什么会在 IE 中发生这种情况。有人知道吗?也欢迎保存该唯一密钥的其他选项/想法。

提前致谢。

4

2 回答 2

1

可能的想法/您可能会尝试的事情清单。多年来收集的一些信息!

您还应该 100% 确保您的 cookie 代码不会重置 cookie。我已经做到了,我知道其他人也做到了。我们发誓它不是我们的代码,但最终有时它是;)

远离 cookie 名称中的特殊字符,例如下划线 (_) 和连字符 (-)。IE 不喜欢它们,有时东西可以工作,有时则不行。

确保为 cookie 设置一个非常遥远的过期日期。浏览器使用计算机本地时间来查看 cookie 是否仍然可用。如果计算机的日期和时间不正确,可能会导致类似这样的问题。

确保为正确的域名设置 cookie,我见过有人为 path.example.com 设置 cookie,然后尝试从 bob.example.com 访问它们。由于跨域策略,这将不起作用。

如果您尝试通过 Javascript 访问 cookie,您应该确保您没有将 httponly 标志设置为 true。此标志将 100% 防止任何 cookie 被 Javascript 访问。

如果您在 iframe 或框架集中设置 cookie,您很可能需要在服务器上设置 P3P 策略。如果您计划支持 IE,您很可能应该有一个人。欲了解更多信息,请访问http://en.wikipedia.org/wiki/P3P

示例 HTACCESS 设置 P3P 策略:

<IfModule mod_headers.c>
    Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
</IfModule>

对于监控 cookie 的方法,我建议使用 Chrome 的检查器。在网络选项卡下,您可以单击一个请求,它会为您提供更多选项卡,例如 Cookie 选项卡,可让您查看所有 cookie。

于 2012-12-16T08:13:07.117 回答
1

也许是史蒂文给出的答案的一部分,但我已经找到并重写了一些用于 cookie 的函数:

function setCookie(name, value, days) {
if (days) {
    var date = new Date();
    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
    var expires = "; expires=" + date.toGMTString();
}
else var expires = "";
document.cookie = name + "=" + value + expires + "; path=/";
}

并获得一个 cookie:

function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0) == ' ') c = c.substring(1, c.length);
    if (c.indexOf(nameEQ) == 0) 
        return c.substring(nameEQ.length, c.length);
}
return null;
}

这对我来说效果更好。

作为 iFrame 的一部分:已修复。可以再次找到 Cookie,我将 ajax 调用从 json 更改为 jsonp。

再加上 Steven 的一些提示,现在在 IE 中一切正常。甚至 Chrome 也得到了需要做的事情:)

于 2012-12-16T11:01:15.893 回答