如何正确更新 cookie?
Posted
技术标签:
【中文标题】如何正确更新 cookie?【英文标题】:How to update a cookie properly? 【发布时间】:2016-01-29 20:04:12 【问题描述】:我正在通过下面创建的代码 sn-p 创建和设置 cookie。
当我尝试获取 document.cookie
以验证我的 cookie 是否已正确创建时,我看到了一个差异。
请允许我详细说明:
我正在使用由Math.floor(Math.random() * 2)
生成并存储在cookieValue
中的50/50 随机数生成器。因此,我确保我的 cookie 值始终为 0 或 1。此参数以及其余参数将成为 cookieStr
的一部分,它们将被传递到 document.cookie
以创建 cookie。
但是,为了验证这是否正确发生,我需要确保当前 cookie SomeCookieName
与我的 console.log(cookieStr)
的输出具有相同的值。这意味着我正在正确地动态更新 cookie。
快速查看下面的代码(在控制台中),我可以看出有些不对劲。 SomeCookieName
总是为 0,其中随机数生成器将分别输出 0 和 1。
TL;DR:
我认为我没有正确更新SomeCookieName
参数的值,根据cookieValue
随机函数,它应该是0
或1
;但我不知道为什么会这样。我做错了什么?
var hoursToAdd = 3,
daysToAdd = 10,
cookieValue = Math.floor(Math.random() * 2), // Random value 0 or 1
cookieName = "SomeCookieName",
cookiePath = "/",
cookieDomain = "*.somedomainname.com";
setCookie(cookieName, cookieValue, 0, hoursToAdd, cookiePath, cookieDomain);
console.log(document.cookie);
function setCookie(c_name, c_value, c_exdays, c_exhours, c_path, c_domain)
var exdate = new Date(),
cookieStr = "";
// Setting up the cookie value
cookieStr = c_name + "=" + escape(c_value) + "; ";
// Determining the expiration date increase: days or hours
if (c_exdays) // Adds days to current date
exdate.setDate(exdate.getDate() + (c_exdays));
else if (c_exhours) // Adds hours to current date
exdate.setHours(exdate.getHours() + c_exhours);
// Setting up the cookie expiration date
cookieStr += "expires=" + exdate.toUTCString() + "; ";
// Setting up the cookie Path
if (c_path)
cookieStr += "path=" + c_path + "; ";
// Setting up the cookie Domain
if (c_domain)
cookieStr += "domain=" + c_domain + "; ";
console.log(cookieStr);
// Creating the cookie
document.cookie = cookieStr;
编辑:添加控制台日志输出。
我正在查看的控制台输出对我来说似乎不稳定。那是因为我希望SomeCookieName
的值每次都应该相同。注意有两个console.log
看上面的sn-p,自己试试看控制台输出:
一些CookieName=0;过期=格林威治标准时间 2016 年 1 月 29 日星期五 23:14:34;路径=/; domain=*.somedomainname.com;
一些CookieName=0; _ga=GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48=2
一些CookieName=1;过期=格林威治标准时间 2016 年 1 月 29 日星期五 23:14:35;路径=/; domain=*.somedomainname.com;
一些CookieName=0; _ga=GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48=2
一些CookieName=1;过期=格林威治标准时间 2016 年 1 月 29 日星期五 23:14:36;路径=/; domain=*.somedomainname.com;
一些CookieName=0; _ga=GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48=2
一些CookieName=1;过期=格林威治标准时间 2016 年 1 月 29 日星期五 23:15:02;路径=/; domain=*.somedomainname.com;
一些CookieName=0; _ga=GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48=2
一些CookieName=1;过期=格林威治标准时间 2016 年 1 月 29 日星期五 23:15:03;路径=/; domain=*.somedomainname.com;
一些CookieName=0; _ga=GA1.2.988843064.1445444954; BCSI-CS-9cd60cd21b772d48=2
【问题讨论】:
为我工作:jsfiddle.net/2oh4665w @Fabricator 你能详细说明一下吗?我正在查看控制台输出,发现SomeCookieName
的值不同
每次都将其设置为 0 或 1。您是否希望 cookie 值在第一次设置后保持不变?
@Fabricator 将其设置为 0 或 1 是正确的。我希望这样:创建值为 0 的 cookie,控制台日志 cookie 应显示值为 0,如果在创建 cookie 时值为 1,则控制台日志应显示 cookie 值为 1。那有意义吗?我认为我没有正确更新 cookie 值因为它没有向我显示所描述的行为......否则我误解了某些东西,我看不到它是什么
@Fabricator 你的小提琴对我不起作用,因为域不正确——我根本没有看到 SomeCookieName
被设置。 (它真的对你有用吗?还是我完全误解了这里的目标是什么?)我修改了域,以便确实有效,据我所知目标:jsfiddle.net/2oh4665w/1(OP:这是你的行为吗?期待?)
【参考方案1】:
如果您在设置document.cookie
时包含domain
参数,那么为了读取该cookie,domain
必须与运行脚本的页面的域/子域匹配。
在这种情况下,您可能会在较早时在测试时设置带有域的SomeCookieName=0
。然后,您尝试更改它,但您包含无效的domain
,因此未设置 cookie。
如果您使domain
与您的实际域匹配,或者完全省略它,cookie 将被设置并在您重置时更改。
【讨论】:
谢谢!我不知道会发生这种情况,特别是因为没有抛出无效参数的错误,即无效域以上是关于如何正确更新 cookie?的主要内容,如果未能解决你的问题,请参考以下文章
Asp.net mvc controller 中如何正确存取cookie
如何在页面打开后从 cookie 中正确设置属性(如果用户已登录)或使用路由器和 redux 在 React 中使用 F5