使用decodeURI与cookie javascript

时间:2013-11-13 21:39:49

标签: javascript cookies

我的问题在于我需要一个变量来跟踪我的所有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变量时,我无法弄清楚为什么没有发生这种情况。谢谢

2 个答案:

答案 0 :(得分:9)

你不应该编码'expires ='。它将变成'expires%3D',这不是你想要的。 除此之外,使用'encodeURI'可能是一个坏主意,因为它不编码';'和','根据要求。

您可以使用encodeURIComponent对cookie值进行编码,但使用escape()对cookie值进行编码在技术上是正确的。

因此...

document.cookie = "count=" + encodeURIComponent(count.toString()) + "; expires=" + exDate.toUTCString();

......应该做你想做的事 cookie由几部分组成;我们最感兴趣的是名称,价值和到期日。

(官方回答结束)


让我们澄清编码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值,在您持久化(并检索)该值时进行编码(和解码)。