【问题标题】:How to save large data in cookie如何在cookie中保存大数据
【发布时间】:2018-02-14 01:43:03
【问题描述】:

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

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

你的解决方案是什么?


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

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

【问题讨论】:

  • laravel 与 浏览器 cookies 无关
  • 我的解决方案是不要 ...改为使用会话(不知道为什么这个问题被赞成 - 似乎达到了反对按钮下的定义“这个问题没有显示任何研究成果;不清楚或没有用”)。
  • 我的第一个问题是,你在 cookie 中存储这么多数据到底是为了什么?
  • @Iwrestledabearonce。我们可以在 laravel 中发送 cookie 作为响应 .\Cookie::make("name", "value", 3000);
  • 我有一次在饼干里放了太多巧克力片,结果发现是一块巧克力棒,中间有一点面粉。这篇文章让我想起了这一点。

标签: javascript php jquery cookies


【解决方案1】:

这是一个有趣的问题(但一个糟糕的想法),所以我决定只是为了好玩而测试一下(我什至会给你 codez,如果你坚持的话,你可以这样做).. 但问题是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

【讨论】:

    【解决方案2】:

    不要将数据存储在 cookie 中。 使用会话外观或会话助手将数据存储在会话中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多