为何JavaScript能读取已过期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
相关产品推荐
相关产品推荐

