我的 cookie 在会话之间没有保留?



我有一个cookie,可以保存一些相当良性的数据,我用它来检查Changelog模式窗口是否应该出现在页面上。当我加载页面时,根本没有cookie。该项目在IIS上运行,使用带有ASP和MVC的.NET Core 2.2。所以我做了以下几点:

function showChangelog(override = false) {
let newestEntryId = getNewestChangelogVersion();
let cookieEntryId = getCookieChangelogVersion();
if (newestEntryId > cookieEntryId) {
setCookieDetails(false, newestEntryId);
cookieEntryId = newestEntryId;
}
let changelogPersistence = getCookieChangelogPersistence();
if (changelogPersistence === false || override === true) {
let modalBody = $('#changelogModalBody');
...
...

以下是发生的情况:

  • 第一个检查返回 0。理应如此。这是更改日志对象中的最新条目。
  • 第二个检查返回 -1。理应如此。在这个阶段没有要检查的cookie,所以我返回-1来指示这一点。
  • 然后我看看从更新日志中收集的最新条目是否高于 cookie 中收集的最新条目。如果是,请覆盖它并将新版本号写入 cookie。这将生成以下 cookie:

"dontPersistChangelog=false;更新日志版本=0;路径=/;expires=星期二, 06 九月 2022 13:54:33 GMT">

  • 然后,从这个新的 cookie 中,我检查 cookie 持久性标志是真还是假。如果为 true,则不要显示窗口。如果为假,则显示窗口。
  • 然后代码继续使窗口出现所有相关信息。听上去很好。

为了更好地衡量,以下是设置 cookie 的代码:

/**
* Used to set the website cookie for the changelog window.
* @param {boolean} persistence        Whether the changelog should not persist (true) or persist (false)
* @param {number} version             What version of the log is being put in the cookie.
*/
function setCookieDetails(persistence, version) {
let expirationDate = new Date();
expirationDate.setDate(expirationDate.getDate() + 999);
let persistChangeLog = 'dontPersistChangelog=' + persistence;
let changelogVersion = 'changelogVersion=' + version;
document.cookie = persistChangeLog;
document.cookie = changelogVersion;
document.cookie = 'path =/';
document.cookie = 'expires=' + expirationDate.toUTCString();
}

这是令人费解的部分;当我关闭浏览器并启动浏览器备份时,实际的cookie会抓住存在。我在浏览器中使用控制台进行了检查。就像它被删除并消失了一样。我的印象是document.cookie与会话cookie不同?它可以通过单独的会话持续存在吗?

我尝试了有和没有有效期的饼干。无论哪种方式,都会删除 Cookie。当我在 Visual Studio 中运行项目或在 IIS 上部署的版本时,都会发生这种情况。

我可能做错了什么?

请参阅 https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie

我不认为您对document.cookie的调用正在更新现有cookie的属性。 Cookie 的属性以分号分隔并存储为字符串。

所以你设置了一个像这样的cookie:

function resetOnce() { 
document.cookie = "doSomethingOnlyOnce=; expires=Thu,01 Jan 2050 00:00:00 GMT";
}

因此,对于上面的函数:

function setCookieDetails(persistence, version) {
let expirationDate = new Date();
expirationDate.setDate(expirationDate.getDate() + 999);
let persistChangeLog = 'dontPersistChangelog=' + persistence;
let changelogVersion = 'changelogVersion=' + version;
document.cookie = persistChangeLog + ";path =/;expires=" + expirationDate.toUTCString();
document.cookie = changelogVersion + ";path =/;expires=" + expirationDate.toUTCString();}

最新更新