我的问题在于我需要一个变量来跟踪我的所有cookie,这样我就可以将该变量中的字符串拆分成一个数组,然后从那里解析字符串。我想知道为什么简单的以下代码不适合我?
var count = 0; //keeps track of how many times this page has been visited
var lastVisit = new Date(); //records the last visit date in UTC format (or extra-challenge: in a user-friendly format like "Tuesday 10/12/2013 at 9:34:50")
var exDate = new Date(lastVisit.getTime() + 30000);
var savedData = decodeURI(document.cookie); //contains cookie contents
document.cookie = encodeURI("count=" + count.toString() + "; expires=" + exDate.toUTCString());
我需要发生的是每当我设置一个cookie以便将其添加到savedData变量时,我无法弄清楚为什么没有发生这种情况。谢谢
答案 0 :(得分:9)
你不应该编码'expires ='。它将变成'expires%3D',这不是你想要的。 除此之外,使用'encodeURI'可能是一个坏主意,因为它不编码';'和','根据要求。
您可以使用encodeURIComponent对cookie值进行编码,但使用escape()对cookie值进行编码在技术上是正确的。
因此...
document.cookie = "count=" + encodeURIComponent(count.toString()) + "; expires=" + exDate.toUTCString();
......应该做你想做的事 cookie由几部分组成;我们最感兴趣的是名称,价值和到期日。
(官方回答结束)
如果有任何疑问,请联系RFC,不要只选择在网络上找到的任何可行的内容。
Cookie名称的类型为 token ,这意味着其中只允许使用这些值:
0x21-0x27 , 0x2A-0x2B , 0x2D-0x2E , 0x30-0x39 , 0x41-0x5A , 0x5E-0x7A 和 0x7E 。
换句话说:以下值应该是百分比编码的:
0x00-0x20 ,'(',')',',','/' ,':',';','<','=', '>','?','@','\','[ ',']','{','}'和 0x7F-0xFF 。
Cookie值的类型为 cookie-octet ,这意味着其中只允许使用这些值:
0x21,0x23-0x2B,0x2D-0x3A,0x3C-0x5B,0x5D-0x7E 。
换句话说:以下值应该是百分比编码的:
0x00-0x20 , 0x22 ,',',';','\'和 0x7F-0xFF 。
现在,使用toUTCString()对失效日期进行编码,正如您所做的那样 结果如下所示:周三,2021年6月9日10:18:14 GMT - 因此它将包含一个逗号。但!除了cookie-name和cookie-value字符串之外,你不应该编码任何东西。
注意:W3Schools表示在JavaScript 1.5中不推荐使用escape(),但对于使用encodeURI()或encodeURIComponent()来说,在技术上是不正确的。在cookie中使用escape()技术上是正确的。
RFC 6265 section 5.4 明确指出:
注意:尽管名称如此,但cookie字符串实际上是一系列的 八位字节,而不是一系列字符。转换cookie字符串
(或其组成部分)成为一系列字符(例如,用于
向用户呈现),用户代理可能希望尝试使用
用于解码八位位组序列的UTF-8字符编码[RFC3629] 然而,这种解码可能会失败,因为不是每一个序列 八位字节是有效的UTF-8。
由于decodeURIComponent()用于unicode字符串,并且阻塞0x00和0xFF之间的字节值,因此不能安全地使用。 另一方面,对于字符串,unescape()不,但对于8位字节序列,也就是说。 八位字节,但前提是您的字节序列不包含unicode字符。
如果您的cookie值包含unicode字符,那么应但是,使用encodeURIComponent()/ decodeURIComponent(),但是您还应该捕获任何异常,因为服务器可能无法向您发送您想要的内容接受。
答案 1 :(得分:0)
大多数浏览器还支持btoa
用于Base64编码,atob
用于解码Base64。 Base64中的所有字符都是合法的 cookie-octets (以ASCII或UTF-8解释时)。因此,您可以(以额外的存储空间为代价)将持久值的Base64编码存储为cookie值,在您持久化(并检索)该值时进行编码(和解码)。