【发布时间】:2014-04-03 08:26:53
【问题描述】:
如果应用程序尝试设置持久性 cookie,但浏览器的安全设置被配置为阻止持久性 cookie,浏览器是否会将其视为会话 cookie 并将其存储到浏览会话结束?
如果您想存储用户购物篮的 ID 或类似信息,您需要知道这一点。如果浏览器接受,您希望它使用持久 cookie,否则回退到会话 cookie。
【问题讨论】:
如果应用程序尝试设置持久性 cookie,但浏览器的安全设置被配置为阻止持久性 cookie,浏览器是否会将其视为会话 cookie 并将其存储到浏览会话结束?
如果您想存储用户购物篮的 ID 或类似信息,您需要知道这一点。如果浏览器接受,您希望它使用持久 cookie,否则回退到会话 cookie。
【问题讨论】:
好吧,我不耐烦了,自己做了一些实验。
被阻止的持久性 cookie 不会被隐式“降级”为会话 cookie,它们根本不会被存储 - 请参阅下面的实验。
您可能会想“是的,这很明显,您不理解 'blocked' 这个词的哪一部分?”。如果您想使用持久 cookie 并回退到会话 cookie,请记住这一点。
在上面的购物篮场景中,最好的方法可能是将购物篮 ID 同时存储在持久 cookie 和会话 cookie 中。如果永久 cookie 被阻止,那么至少您可以在浏览器会话的其余部分使用会话 cookie。在用户下次访问网站时(在会话 cookie 被删除后),您可以使用持久 cookie(如果可用)恢复他们的购物篮。
这是我在 Internet Explorer 11 中运行的一个实验。
第 1 步:存储一些示例 cookie,其设置接受会话和持久性 cookie
在 IE 中,打开 Internet 选项 - 隐私选项卡 - 高级按钮 对于第一方 Cookie,选择“接受”并选中“始终允许会话 Cookie”
浏览到http://stackoverflow.com,打开 F12 开发者工具并在控制台窗口中运行以下脚本:
var expiry = new Date();
expiry.setDate(expiry.getDate() + 7);
// set a persistent cookie
document.cookie='persistent1=test;path=/;expires=' + expiry.toUTCString();
// set a session cookie
document.cookie='session1=test;path=/';
document.cookie;
document.cookie 按我们的预期输出“persistent1=test; session1=test”。
关闭并重新打开 IE 并从控制台再次运行“document.cookie”。持久性 cookie 仍然存在,但会话 cookie 已消失。
到目前为止没有什么新鲜事,这是显而易见的。但是,会话 cookie 行为因浏览器而异,可能会混淆实验 - 例如,Chrome doesn't always delete session cookies。
第 2 步:存储一些示例 cookie,其设置接受会话 cookie 但阻止持久性 cookie
删除浏览历史记录,让我们重新开始。
在 IE 中,打开 Internet 选项 - 隐私选项卡 - 高级按钮 对于第一方 Cookie,选择“阻止”并选中“始终允许会话 Cookie”
浏览回http://stackoverflow.com 并再次运行上述脚本。
这一次,document.cookie 输出“session1=test” - 只存储了会话 cookie。被阻止的持久 cookie 根本没有被存储并且不可用,甚至不能作为会话 cookie。
【讨论】:
持久性 cookie 保持持久性。 会话 cookie 只是会话的 cookie。 持久性 cookie 是持久性的,这说明了一切
【讨论】: