【问题标题】:Cookie value always returns falseCookie 值总是返回 false
【发布时间】:2018-11-10 02:03:32
【问题描述】:

我正在使用 cookiebot 来遵守 GDPR,但到目前为止,cookieBot 脚本似乎没有按预期工作。所以我必须添加一些额外的功能来更好地控制页面的内容,例如启用/禁用嵌入 Youtube 视频部分。

CookieBot 以以下格式在 cookie 上存储与 4 种类型相关的信息,不确定这是否是正确的 JSON 格式?

{stamp:'HMzWoJn8V4ZkdRN1DduMHLhS3dKiDDr6VoXCjjeuDMO2w6V+n2CcOg==',necessary:true,preferences:true,statistics:true,marketing:false,ver:1}

并使用CookieConsent 作为 cookie 的名称。

当用户使用addEventListener点击页面时,我正在尝试读取这些 cookie 的值

 document.addEventListener("click", function () {
                console.log("document capture click");
                readCookies();
            }, true);


            function readCookies() {
                console.log("Ready to Read");

                Cookies.get('CookieConsent')

                //Parse the cookie to Object

                cookieval = Cookies.get('CookieConsent');
                console.log(cookieval);

                console.log("Necessary: " + Boolean(cookieval.necessary));
                console.log("Prefrences: " + Boolean(cookieval.preferences));
                console.log("Statistics: " + Boolean(cookieval.statistics));
                console.log("Marketing: " + Boolean(cookieval.marketing));
            }

对我来说,问题是所有值都返回为 false,我使用 https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js 读取 cookie 值,不知道为什么 cookieval.marketing 总是返回 false,即使它在 cookie 中为 true

输出

Ready to Read
{stamp:'HMzWoJn8V4ZkdRN1DduMHLhS3dKiDDr6VoXCjjeuDMO2w6V+n2CcOg==',necessary:true,preferences:true,statistics:true,marketing:false,ver:1}
Necessary: false
Prefrences: false
Statistics: false
Marketing: false

【问题讨论】:

  • document.cookie的返回值是多少?
  • @str,它在CookieConsent={stamp:'HMzWoJn8V4ZkdRN1DduMHLhS3dKiDDr6VoXCjjeuDMO2w6V+n2CcOg==',necessary:true,preferences:true,statistics:true,marketing:false,ver:1}; 之后返回
  • cookiebot 是否编写了那个 cookie?如果是,它们可能还提供读取它的功能。由于它不是 JSON,因此没有简单安全的方法来解析它。
  • @str,Cookie 是由 cookieBot 编写的,但他们没有提供任何功能让用户与 cookie 进行交互,因此我正在查看自定义功能

标签: javascript jquery json cookies


【解决方案1】:

Cookies.get('CookieConsent'); 将返回一个字符串

如果要将 JSON 转换为 JavaScript 对象,则必须对其进行解析。


注意:

{stamp:'HMzWoJn8V4ZkdRN1DduMHLhS3dKiDDr6VoXCjjeuDMO2w6V+n2CcOg==',necessary:true,preferences:true,statistics:true,marketing:false,ver:1}

... 不是有效的 JSON。

您还需要更改设置 cookie 的代码,以便生成有效的 JSON。

【讨论】:

  • 我在代码中这样做`console.log("Necessary: " + Boolean(cookieval.necessary));` 或者这是错误的
  • @Learning — 该代码试图从存储在cookieval 中的对象中读取necessary ... 这是一个字符串,因此它没有@987654324 @。您必须解析 JSON 以将 JSON 字符串转换为它所代表的对象。
  • @Quentin 不过好像不是 JSON。
  • 哦,是的,我对引用的代码没有给予足够的重视,并相信问题中的陈述:CookieBot将cookie上4种类型的相关信息以json格式存储 .答案已更新。
  • @Quentin,我可以更改 cookie,因为它由第三方 CookieBot 存储。所以这不是一个值 JSON 格式。有没有办法我们可以正确地从这个 cookie 中读取值。
【解决方案2】:

您需要按如下方式解析类似 json 的字符串

var cookieStr = Cookies.get('CookieConsent');  //{stamp:'HMzWoJn8V4ZkdRN1DduMHLhS3dKiDDr6VoXCjjeuDMO2w6V+n2CcOg==',necessary:true,preferences:true,statistics:true,marketing:false,ver:1}

cookieStr = cookieStr.substr(1, cookieStr.length - 2);  //Get rid of {} marks

var cookieArr = cookieStr.split(',')    //Separate properties

var cookieObj = {}
cookieArr.forEach(function(item) {
   cookieObj[item.split(':')[0]] = item.split(':')[1];    //Assemble new object
})

console.log("Necessary: " + cookieObj.necessary);

【讨论】:

  • cookie值不是JSON,不能用JSON.parse解析。
  • 生成错误SyntaxError: JSON.parse: expected property name or '}'
  • 根据 OP 声明,它是一个 json 字符串 {stamp:'HMzWoJn8V4ZkdRN1DduMHLhS3dKiDDr6VoXCjjeuDMO2w6V+n2CcOg==',necessary:true,preferences:true,statistics:true,marketing:false,ver:1}
  • 哦,是的 - 双引号。
  • 解析这样的结构并不容易。对于包含,: 的任何内容(对于此用例可能不重要),它将中断,字符串将包含引号,并且它不适用于false,因为Boolean('false') 等于true。跨度>
猜你喜欢
  • 1970-01-01
  • 2017-11-23
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 2021-11-05
  • 2018-11-05
  • 2019-05-06
相关资源
最近更新 更多