如何在cookie中保存大数据

时间:2018-02-13 16:51:52

标签: javascript php jquery cookies

根据这篇文章Browser Cookie Limits,我们可以在每个cookie中存储4kb字符串。

现在我希望在cookie中存储超过4KB的字符串(没有LocalStorage)。

您的解决方案是什么?

cookie[0] = 4kb
cookie[1] = 4kb
cookie[2] = 4kb
cookie[3] = 4kb

这是一个好方法。但我不知道如何编码。

2 个答案:

答案 0 :(得分:0)

不要将数据存储在Cookie中。 使用会话Facade或会话助手将数据存储在会话中。

如果需要它持续很长时间在cookie中存储唯一的id,并使用它来从相关的序列化文件或数据库中检索数据。确保使用安全方法生成ID并验证ID,因此某些恶意用户无法欺骗cookie id迭代它并获取其他用户的所有数据。

答案 1 :(得分:0)

这是一个有趣的问题(但是一个可怕的想法),所以我决定只是为了好玩来测试它(我甚至会给你代码,所以如果你坚持的话,你可以做到这一点)..但是问题是cookie会随着来自该域的每个请求被发送到服务器,如果你很快将任意数据填入你的cookie,请求标题将太大而服务器无法理解..

在我的测试中,我在将大量数据插入到我的网页Cookie后刷新页面后立即得到了这个内容。

  

错误请求

     

您的浏览器发送了此服务器无法理解的请求。   请求标头字段的大小超出服务器限制。

     

Cookie

这是我用来测试它的代码。它完全符合您的建议,将字符串分解为块(在检查浏览器能够填充到单个cookie中的数据量之后),然后将每个块插入到索引的cookie中。

这打破了我在Chrome中的测试域,不在生产中使用它,仅用于测试。

var veryBigString = "Farts ".repeat(99999);
setCookieBatch('myBigCookie', veryBigString);

function setCookieBatch(cname, bigStr){
  var chunks = bigStr.match(new RegExp('[\\s\\S]{1,' +maxCookieSize() + '}', 'g'));
  for(var i=chunks.length; i--;){
    setCookie(cname+"_"+i, chunks[i]);
  }
}

function maxCookieSize(){
  for(var i=0;;i++){
    let str = "1".repeat(i);
    setCookie("c000test", str);
    if(getCookie('c000test') !== str){ 
      document.cookie = 'c000test=;expires=Thu, 01 Jan 1970 00:00:01 GMT;';
      return i;
    }
  }
}

function setCookie(cname, cvalue) {
  var d = new Date();
  d.setTime(d.getTime() + 864000000000);
  var expires = "expires=" + d.toUTCString();
  document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}

function getCookie(cname) {
  var name = cname + "=";
  var ca = document.cookie.split(';');
  for (var i = 0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0) == ' ') c = c.substring(1);
    if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
  }
  return "";
}

如果您想要一个不错的跨浏览器解决方案,请考虑jSQL;