首页 > 其他分享 >使用原生 cookieStore 方法,让 Cookie 操作更简单

使用原生 cookieStore 方法,让 Cookie 操作更简单

时间:2024-02-27 18:57:37浏览次数:29  
标签:原生 console cookieStore value cookie key Cookie log

前言

对于前端来讲,我们在操作cookie时往往都是基于document.cookie,但它有一个缺点就是操作复杂,它并没有像localStorage那样提供一些getset等方法供我们使用。对与cookie的操作一切都是基于字符串来进行的。为了让cookie的操作更简便, Chrome87率先引入了cookieStore方法。

document.cookie

document.cookie可以获取并设置当前文档关联的cookie

获取cookie

const cookie = document.cookie

在上面的代码中,cookie 被赋值为一个字符串,该字符串包含所有的 Cookie,每条 cookie 以"分号和空格 (; )"分隔 (即, key=value 键值对)。

但这拿到的是一整个字符串,如果你想获取cookie中的某一个字段,还需要自己处理

const converter = {
  read: function (value) {
    if (value[0] === '"') {
      value = value.slice(1, -1);
    }
    return value.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent)
  },
  write: function (value) {
    return encodeURIComponent(value).replace(
      /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,
      decodeURIComponent
    )
  }
}
function getCookie (key) {
            
  const cookies = document.cookie ? document.cookie.split('; ') : [];
  const jar = {};
  for (let i = 0; i < cookies.length; i++) {
    const parts = cookies[i].split('=');
    const value = parts.slice(1).join('=');

    try {
      const foundKey = decodeURIComponent(parts[0]);
      jar[foundKey] = converter.read(value, foundKey);

      if (key === foundKey) {
        break
      }
    } catch (e) {}
  }
  return key ? jar[key] : jar
}
console.log(getCookie('name'))  // 前端南玖

比如上面这段代码就是用来获取单个cookie值的

设置cookie

document.cookie = `name=前端南玖;`

它的值是一个键值对形式的字符串。需要注意的是,用这个方法一次只能对一个 cookie 进行设置或更新

比如:

document.cookie = `age=18; city=shanghai;`

这样只有age能够设置成功

  • 以下可选的 cookie 属性值可以跟在键值对后,用来具体化对 cookie 的设定/更新,使用分号以作分隔:

    • ;path=path (例如 '/', '/mydir') 如果没有定义,默认为当前文档位置的路径。

    • ;domain=domain (例如 'example.com', 'subdomain.example.com') 如果没有定义,默认为当前文档位置的路径的域名部分。与早期规范相反的是,在域名前面加 . 符将会被忽视,因为浏览器也许会拒绝设置这样的 cookie。如果指定了一个域,那么子域也包含在内。

    • ;max-age=max-age-in-seconds (例如一年为 606024*365)

    •   ;expires=date-in-GMTString-format
      

      如果没有定义,cookie 会在对话结束时过期

    • ;secure (cookie 只通过 https 协议传输)

  • cookie 的值字符串可以用encodeURIComponent() (en-US)来保证它不包含任何逗号、分号或空格 (cookie 值中禁止使用这些值).

function assign (target) {
  for (var i = 1; i < arguments.length; i++) {
    var source = arguments[i];
    for (var key in source) {
      target[key] = source[key];
    }
  }
  return target
}
function setCookie (key, value, attributes) {
  if (typeof document === 'undefined') {
    return
  }

  attributes = assign({}, { path: '/' }, attributes);

  if (typeof attributes.expires === 'number') {
    attributes.expires = new Date(Date.now() + attributes.expires * 864e5);
  }
  if (attributes.expires) {
    attributes.expires = attributes.expires.toUTCString();
  }

  key = encodeURIComponent(key)
    .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)
    .replace(/[()]/g, escape);

  var stringifiedAttributes = '';
  for (var attributeName in attributes) {
    if (!attributes[attributeName]) {
      continue
    }

    stringifiedAttributes += '; ' + attributeName;

    if (attributes[attributeName] === true) {
      continue
    }
    stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];
  }

  return (document.cookie =
          key + '=' + converter.write(value, key) + stringifiedAttributes)
}

setCookie('course', 'fe', { expires: 365 })

这里是js-cookie库对setCookie方法的封装

删除cookie

function removeCookie (key, attributes) {
  setCookie(
    key,
    '',
    assign({}, attributes, {
      expires: -1
    })
  );
}

removeCookie('course')

新方法cookieStore

以上就是通过document.cookie来操作cookie的方法,未封装方法之前操作起来都非常的不方便。现在我们再来了解一下新方法cookieStore,它是一个类似localStorage的全局对象。

它提供了一些方法可以让我们更加方便的操作cookie

获取单个cookie

cookieStore.get(name)

该方法可以获取对应key的单个cookie,并且以promise形式返回对应的值

async function getCookie (key) {
  const name = await cookieStore.get(key)
  console.log('【name】', name)
}
getCookie('name')

当获取的cookie不存在时,则会返回null

获取所有cookie

cookieStore.getAll()

该方法可以获取所有匹配的cookie,并且以promise形式返回一个列表

async function getAllCookies () {
  const cookies = await cookieStore.getAll()
  console.log('【cookies】', cookies)
}
getAllCookies()

cookie不存在时,则会返回一个空数组

设置cookie

cookieStore.set()

该方法可以设置cookie,并且会返回一个promise状态,表示是否设置成功

function setCookie (key, value) {
  cookieStore.set(key, value).then(res => {
    console.log('设置成功')
  }).catch(err => {
    console.log('设置失败')
  })
}
setCookie('site', 'https://bettersong.github.io/nanjiu/')

如果想要设置更多的属性,比如:过期时间、路径、域名等,可以传入一个对象

function setCookie (key, value) {
  cookieStore.set({
    name: key,
    value: value,
    path: '/',
    expires: new Date(2024, 2, 1)
  }).then(res => {
    console.log('设置成功')
  }).catch(err => {
    console.log('设置失败')

  })
}
setCookie('site', 'https://bettersong.github.io/nanjiu/')

删除cookie

cookieStore.delete(name)

该方法可以用来删除指定的cookie,同样会返回一个promise状态,来表示是否删除成功

function removeCookie (key) {
  cookieStore.delete(key).then(res => {
    console.log('删除成功')
  }).catch(err => {
    console.log('删除失败')
  })
}
removeCookie('site')

需要注意的是:即使删除一个不存在的cookie也会返回删除成功状态

监听cookie

cookieStore.addEventListener('change', (event) => {
  console.log(event)
});

可以通过change事件来监听cookie的变化,无论是通过cookieStore操作的,还是通过document.cookie来操作的都能够监听到。

该方法的返回值有两个字段比较重要,分别是:changedelete,它们都是数组类型。用来存放改变和删除的cookie信息

监听修改

调用set方法时,会触发change事件,修改或设置的cookie会存放在change数组中

cookieStore.addEventListener('change', (event) => {
  const type = event.changed.length ? 'change' : 'delete';
  const data = (event.changed.length ? event.changed : event.deleted).map((item) => item.name);

  console.log(`【${type}】, cookie:${JSON.stringify(data)}`);
});

function setCookie (key, value) {
  cookieStore.set(key, value).then(res => {
    console.log('设置成功')
  }).catch(err => {
    console.log('设置失败')
  })
}
setCookie('site', 'https://bettersong.github.io/nanjiu/')

⚠️需要注意的是:

  • 通过document.cookie设置或删除cookie时,都是会触发change事件,不会触发delete事件

  • 即使两次设置cookie的namevalue都相同,也会触发change事件

监听删除

调用delete方法时,会触发change事件,删除的cookie会存放在delete数组中

cookieStore.addEventListener('change', (event) => {
  const type = event.changed.length ? 'change' : 'delete';
  const data = (event.changed.length ? event.changed : event.deleted).map((item) => item.name);

  console.log(`【${type}】, cookie:${JSON.stringify(data)}`);
});

function removeCookie (key) {
  cookieStore.delete(key).then(res => {
    console.log('删除成功')
  }).catch(err => {
    console.log('删除失败')
  })
}
removeCookie('site')

⚠️需要注意的是:

  • 如果删除一个不存在的cookie,则不会触发change事件

兼容性

在使用该方法时需要注意浏览器的兼容性

总结

cookieStore提供的方法比起直接操作document.cookie要简便许多,不仅支持增删改查,还支持通过change事件来监听cookie的变化,但是在使用过程需要注意兼容性问题。

标签:原生,console,cookieStore,value,cookie,key,Cookie,log
From: https://www.cnblogs.com/songyao666/p/18037572

相关文章

  • gin cookie和session
    Cookie●HTTP是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何关系的。如果我们要实现多个页面之间共享数据的话我们就可以使用Cookie或者Session实现●cookie是......
  • AI云增强升级!还原生动人像,拍出质感照片
    近期不少细心用户发现,在用HUAWEIMate60Pro手机拍照后,使用相册中的AI云增强功能,照片变得更加细腻有质感。这是因为AI云增强升级并更新支持了人像模式拍摄的照片,高清自然的人像细节还原和单反级别的光学景深效果,让用户一只华为手机就能随手拍出好照片。还原生动人像,尽显肌肤质感......
  • UNI-APP获取以及使用App的原生权限问题
    UNI-APP获取以及使用App的原生权限问题安卓App现在检测越来越严格,例如相机权限,需要在调用的时候才能去获取用户的权限;而安卓和iOS的权限方法又不同;项目utils里面如下 permission.js就是具体获取各种权限的方法,而具体的拿到权限方法在utils.js里面以相机权限来局里说......
  • 云原生周刊:Docker 推出 Docker Build Cloud
    开源项目推荐Kube-VipKube-Vip旨在为Kubernetes集群提供高可用性和负载均衡功能。它提供了一个可插拔的VIP(虚拟IP)管理器,可以为集群中的服务分配一个虚拟IP地址,并自动将流量路由到正确的节点。该项目提供了多种配置选项,可以根据需要选择适合的负载均衡算法和IP模式。Kub......
  • 青团社:亿级灵活用工平台的云原生架构实践
    作者:杨磊青团社是国内领先的一站式灵活用工招聘服务企业,灵活用工行业的Top1。青团社于2013年在杭州成立,业务已经覆盖全国,在行业深耕10 年。我的分享将分为以下三部分:青团社架构演进的历程青团社如何实现云原生总结与展望云原生架构的演进历程2020 年,我们的技术架构......
  • uniapp之原生APP本地打包成原生APP本地打包安卓APK
    前言由于项目要求将uniapp打包成安卓应用,所以今天来学习如何将uniapp项目打包成安卓apk。出于企业级代码安全考虑,所以选择了原生APP本地打包的方式进行打包,杜绝防止代码泄漏的风险。......
  • 开年喜报!Walrus成功入选CNCF云原生全景图
    近日,数澈软件Seal(以下简称“Seal”)旗下开源应用管理平台Walrus成功入选云原生计算基金会全景图(CNCFLandscape)并收录至“AppDefinitionandDevelopment-ApplicationDefinition&ImageBuild”板块,该板块包含了Helm、Backstage、Dapr等知名开源项目。 图片截自:htt......
  • .NET 9 预览版:打造云原生及人工智能 AI 平台
    前言微软发布了.NET9首个预览版,分享.NET团队对.NET9的初步愿景,该愿景将于今年年底在.NETConf2024上发布。重点关注针对云原生和人工智能领域的应用程序开发以及在性能、生产力和安全性方面投入大量资源,将.NET9打造成云原生开发平台和工具。 云原生.NET团队......
  • 云原生周刊:在 Kubernetes 集群中使用通配符证书 | 2024.2.19
    开源项目推荐kube-fledgedkube-fledged是一个KubernetesOperator,用于直接在Kubernetes集群的工作节点上创建和管理容器映像的缓存。它允许用户定义图像列表以及这些图像应缓存(即拉取)到哪些工作节点上。因此,应用程序Pod几乎立即启动,因为不需要从注册表中提取映像。kube-f......
  • 云原生明星创业公司 Weaveworks 倒闭了,GitOps 该何去何从?
    自从2009年DevOps面世以来,xOps的潘多拉魔盒就被打开了,AIOps、DataOps、DevSecOps、BizDevOps,当然还有最近几年比较火热的GitOps。但是很不幸的是,就在龙年新春前夕,GitOps理论提出者——Weaveworks倒下了。时间回到2月5日,就在大家期待春节长假的时候,一则Weaveworks......