前端开发必看:JS获取Cookie常见问题及解决指南
你是不是刚写完获取Cookie的代码,在电脑上测试得好好的,一上手机就翻车?或者明明看到浏览器里存着Cookie,用JS死活读不出来?就像新手如何快速涨粉需要避坑指南,搞Cookie这玩意也得知道哪里藏着雷。今天咱们就把这些坑一个个刨开看看。
先说说最让人抓狂的情况——代码运行后返回null。上周有个小哥问我:"为什么我用document.cookie.split('; ')拿到的数组是空的?" 结果发现他忘记在分号后面加空格了。对,就是那个小小的空格,能让整个程序崩掉。这种情况特别容易出现在移动端,有些浏览器会自动在Cookie值里加换行符。
??必须检查的三个地方:??
- 域名和路径是否匹配(在/test路径设置的Cookie,在根路径就拿不到)
- HttpOnly属性是不是被勾选了(这个一勾选,JS就彻底没戏)
- 时间戳问题(特别是Safari,过期时间设置不对直接不存)
碰到跨域问题更头大。上次做微信公众号开发,死活拿不到Cookie,最后发现要同时设置Secure和SameSite=None。这里有个坑:iOS14以上的版本,要是没开Secure,SameSite=None根本不生效。这时候别慌,用navigator.userAgent判断下设备类型,单独处理苹果系浏览器。
说到移动端兼容,华为某些机型的WebView能把人气哭。它们的Cookie存储机制和Chrome不一样,得用cookieManager.setAcceptThirdPartyCookies(true)才行。对了,要是看到Cookie值被截断,八成是遇到单个Cookie的4KB限制,这时候得把大数据拆成多个Cookie存。
有人问:"为什么我设置的Cookie第二天就消失了?" 大概率是没写expires或者max-age。这里教你们个窍门——用toUTCString()处理日期,比手动算时间戳靠谱多了。比如这样写:
javascript复制let date = new Date(); date.setMonth(date.getMonth()+1); document.cookie = `user=John; expires=${date.toUTCString()}`;
说到获取Cookie的方法,很多人栽在编码问题上。比如存了中文内容不编码,取的时候直接乱码。正确姿势应该是存的时候用encodeURIComponent(),取的时候用decodeURIComponent()包一层。要是看到%20这种符号,别怀疑,肯定是空格没处理好。
最近遇到个玄学问题:Chrome能正常获取,Firefox总是报错。折腾半天发现是浏览器隐私设置的问题,用户开了"阻止第三方Cookie"的功能。这种时候真没辙,只能提示用户调整设置,或者改用localStorage方案。
最后说个真实案例。某电商网站的下单功能在安卓机上总失效,查了三天发现是Cookie的path参数设成了/login,但下单页面在/order路径下。这种低级错误新手最容易犯,所以千万记得path要设为根目录'/',除非你有特殊需求。
小编观点:调试Cookie问题就像破案,得把network面板、控制台、Application标签页三个地方的线索串起来看。下次再遇到灵异事件,先把document.cookie直接打印出来,说不定那个该死的分号就躲在你看不见的角落里偷笑呢。
本文由嘻道妙招独家原创,未经允许,严禁转载