格式字符串 | 解释 |
---|---|
Www | 星期几,首字母大写,三个字母的简写形式:Mon、Tue等 |
dd | 当月的日期,两位数字,如果是个位数,前面要加0 |
Mmm | 月份,首字母大写,三个字母的简写形式:Jan、Feb |
yyyy | 四位数年份,超过四位数一些浏览器会不兼容 |
hh | 当前小时数,两位数,如果是个位数则前面加0 |
mm | 当前分钟数,两位数,如果是个位数则前面加0 |
ss | 当前秒数,两位数,如果是个位数则前面加0 |
GMT | GMT在这里代表UTC+0 |
我们可以看到格式里既有“星期几”,又有日期,其实有了日期,“星期几”就是多余的,但是它确实真真切切的被写在了标准里:www.rfc-editor.org/rfc/rfc2616…。 其实我们去掉“星期几”,各大主流浏览器 一般都还是能正确解析出时间的,但是我们最好还是按照标准来做,老老实实的把它加上。
expires的有效范围
虽然expires
可以设置任意时间,但是如果你想设置一个足够长的时间,想确保Cookie长期存在浏览器中,这正在变得越来越困难。
Chrome 104版已经根据IETF rfc6265bis-10的草案实现了新的expires规则,即Cookie的最长有效时间不超过400天,如果你将expires
设置超过了400天,浏览器会将其改成400天。而且草案中还规定,浏览器不可以允许设置超过400天,只可以比400天少。
而Safari则更为严格,根据Safari的ITP2.1(intelligent-tracking-prevention)的规则,通过Javascript的document.cookie
设置的Cookie其最长有效期是七天,如果你设置的时间超过七天,它将自动调整到七天。不过通过Http的Set-Cookie
设置的Cookie没有此限制,只要年份不超过9999年,都是可以的。这里说的Http是指浏览器地址栏的URL请求,这种Cookie叫做第一方Cookie。如果是第三方Cookie,则会有种种限制。关于第三方Cookie和Safari的ITP规则,我们将另开一篇文章讲解。
总体来看,Cookie的有效时间正在变得越来越短,这将不可免的影响到我们的业务。
expires的默认值
如果不设置expires
,且也没有设置max-age
(后面会讲),Cookie会被认为是Session Cookie,所谓Session就是一次会话,浏览器关闭后该Cookie便会失效,下次打开浏览器后不会再有该Cookie。
expires用于删除Cookie
指定一个比当前时间早的时间就可以删除目标Cookie。一定记得加上和目标Cookie相同的domain
和path
属性。
这里放出Javascript的示例:
document.cookie = 'xyz=aaa; domain=itthink.tech; path=/; expires=' + new Date(Date.now() - 1).toUTCString();
expires
解释到此结束。
max-age的含义
max-age
定义了一个Cookie在浏览器端保存的秒数,注意是秒,不是毫秒。
该属性名不区分大小写。
和expires
不同的是,max-age
定义了一个时间段,而expires
定义的是一个时间点。
如果max-age
和expires
同时出现,max-age
的优先级高于expires
,max-age
的值会被浏览器采纳,expires
的值被丢弃。
例如,如果希望Cookie保存一年,可以这样设置:max-age=31536000
,31536000
是一年的秒数。
max-age的格式
max-age
的值必须是一个整数,当是负数或者0时代表删除目标Cookie。
max-age的兼容性问题
IE6、IE7、IE8都不支持max-age
,所以如果产品的用户群中有这些浏览器的用户,则要考虑是否使用该属性,毕竟expires
可以达到一样的效果。
expires
的缺点是,它依赖用户端的时间,如果用户端的时间非常不准确的话,可能会导致和我们的预期不一致。
用max-age删除Cookie
当设置成负数或者0时,可以立即删除目标Cookie。
max-age
就是这些了。