在cookie中存储JSON对象是一种好的实践吗?

19

我有以下对象。

position = {
    latitude: 19.067863700000004,
    longitude: 72.9991898,
    pincode: 400701
}

我想把纬度、经度和邮政编码的值存储在cookie中。

我知道三种方法。

i)将整个position对象存储在cookie中(这是不推荐的,根据这里)。

var pos = JSON.stringify(position);
document.cookie = "position=" + pos;

ii) 创建三个cookie latitude, longitudepincode,并将相应的值存储在相应的cookie中。

document.cookie = "latitude=" + position.latitude;
document.cookie = "longitude=" + position.longitude;
document.cookie = "pincode=" + position.pincode;

iii) 创建一个名为position的cookie,并将其值设置为19.067863700000004|72.9991898|400701

var pos = position.latitude + "|" + position.longitude + "|" + position.pincode;
document.cookie = "position=" + pos;

我的问题是存储Cookie的最佳/理想方式是什么?(如果可能,请给出原因)


本地存储怎么样? - hsz
1
我想在页面加载时获取这些数据,因此无法使用本地存储。 - yajiv
在您的情况下,哪种更好:您关心代码的简单性还是关心网络性能,因为cookie将被传输数百万次? - PaulH
我不认为使用 ii) 有什么优势,因为这会增加代码量和数据量。 - PaulH
3
我认为在cookie中存储JSON是可以的,但根据https://curl.se/rfc/cookie_spec.html关于值的规定:“该字符串是一个字符序列,不包括分号、逗号和空格”。因此,在存储cookie之前,您必须使用类似`encodeURIComponent(value)`的方法对其进行编码。 - renardesque
2个回答

13
对于那个小对象,我肯定会将其作为JSON放入cookie中。这样做几乎不会产生任何额外开销,绝对不是问题。
至于什么方法通常最好,这高度取决于你拥有什么和你想要得到什么。
请记住:
- 这会产生开销(来自JSON结构,额外字符) - 选择一个更好的名称,使用名称的前缀,比如你的应用名字加上一些后缀,或者使用一些随机的较长字符串,而不是名称本身,以防止其他应用意外覆盖你的cookie。 - 大而复杂的对象会导致cookie变得很大。很容易超过cookie的4K大小限制。 - 所有人都可以访问浏览器中的cookie(包括恶意网站/插件等和人类),因此将所有重要数据加密是一个好习惯。这最好在后端执行,因为如果接收到未加密的数据,聪明的人可以读取通信内容。
为了解决4K限制问题,您可以将部分负载放入每个cookie中,但是对于大量数据,您最终会得到很多cookie,并且它们不像人们希望的那样易读。如果您的对象具有嵌套对象,那么名称将开始变得像myapp-object-nested1-nested2-property。这可能很难导航,然后在需要从cookie中重新组合单个对象时再次放回。
您可以采用两种方法的混合方式 - 在有意义的地方将大型对象重组为较小对象的组合。这将介于太大的cookie和太多名称的小cookie之间。尝试以可读和快速的方式进行重新组装。
另一个完全不同的选择是本地或会话存储,那里的限制要高得多,因此您可以直接转储更大的JSON数据,但您询问的是关于cookie的,所以我重点关注了这一点。

1

如果您关心安全问题,最好使用一些单向加密算法来对原始数据进行加密,这样即使有人能够访问用户的浏览器,也无法读取/理解cookie。


2
他如何将这些cookie解密为数据以便再次在前端使用? - DanteTheSmith
他应该使用加密函数/算法的反函数来解密。 - Amjad sibili

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接