You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JavaScript能读取已过期Cookie?代码实例疑问

问题分析:过期Cookie仍可读取的原因

先看你提供的这段JavaScript代码:

<script type="text/javascript"> 
$(document).ready(function () { 
    var maintenanceEndDate = new Date(2018, 4, 2, 19, 0, 0); 
    if (getCookie('remindMaintenanceAgain') == '') { 
        setCookie('remindMaintenanceAgain', '1', maintenanceEndDate); 
    } 
    alert(getCookie('remindMaintenanceAgain')); 
}); 

function setCookie(cname, cvalue, maintenanceEndDate) { 
    var expires = "expires=" + maintenanceEndDate; 
    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; 
} 

function getCookie(cname) { 
    var name = cname + "="; 
    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); 
        } 
        if (c.indexOf(name) == 0) { 
            return c.substring(name.length, c.length); 
        } 
    } 
    return ""; 
} 
</script>

你疑惑明明设置了Cookie过期时间为2018年5月2日19:00,但alert还是能显示1,核心问题出在Cookie过期时间的格式处理错误:

  • 在setCookie函数里,你直接把Date对象和字符串拼接生成expires参数:var expires = "expires=" + maintenanceEndDate;。这会把Date对象转成普通的本地时间字符串(比如类似Wed May 02 2018 19:00:00 GMT+0800 (中国标准时间)),但浏览器要求expires必须是UTC/GMT格式的时间字符串才能正确识别。
  • 因为浏览器无法解析这个不标准的过期时间,它会直接忽略这个expires设置,把这个Cookie当成会话Cookie(只有关闭浏览器时才会失效),而不是按你预期的时间过期。所以即使过了2018年5月2日19:00,Cookie依然存在,自然能被getCookie读取到。

解决方法很简单,把Date对象转成UTC格式的字符串即可,修改setCookie函数里的expires行:

var expires = "expires=" + maintenanceEndDate.toUTCString();

这样浏览器就能正确识别过期时间,到点后Cookie会自动被清除,就无法再读取到了。

内容的提问来源于stack exchange,提问作者Pop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:13:19