本地存储——Cookie

认识Cookie

1.Cookie是什么

Cookie全称是HTTP Cookie,简称Cookie,是浏览器存储数据的一种方式,因为存储在用户本地,而不是存储在服务器上,是本地存储,一般会自动随着浏览器每次请求发送到服务器端。

2.Cookie有什么用

利用Cookie跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个网页的停留时间等。

3.可以在浏览器中操作Cookie

不要在Cookie中保存密码等敏感信息。

Cookie的基本用法

  • 写入Cookie
document.cookie = 'username=zs'
document.cookie = 'age=19'
//document.cookie = 'username=zs;age=19'   这种写法是错误的,不能一起设置,只能是一个一个设置
  • 读取Cookie
console.log(document.cookie)

读取的是一个由名值对构成的字符串,每个名值对之间由;(一个分号和一个空格)隔开。读取到的是全部的cookie,原生的cookie不能根据名来读取值,但可以通过封装cookie来进行。

Cookie的属性

1.Cookie的名称(Name)和(Value)

  • 这是最重要的两个属性,创建Cookie时必须填写,其他属性可以使用默认值。
  • Cookie的名称或值如果包含非英文字母,则写入时需要使用encodeURIComponent()编码,读取时使用decodeURIComponent()解码。
document.cookie = `username=${encodeURIComponent('张三)}`
  • 一般名称使用英文字母,不要用中文,值可以用中文,但是要编码。

2.失效(到期)时间

  • 对于失效的Cookie,会被浏览器清除。
  • 如果没有设置失效(到期)时间,这样的Cookie称为会话Cookie,它在内存中,当会话结束,也就是浏览器关闭时,Cookie消失。
  • 想长时间存在,需要设置expires或max-age
    expires:值为Date类型
document.cookie = `username=zs;expires=${new Date('2100-02-02 00:00:00')}`

max-age:值为数字,表示当前时间+多少秒后过期,单位是秒

document.cookie = 'username=zs; max-age=5'

如果max-age的值是0或是负数,则Cookie会被删除

3.Domain域

  • Domain限定了访问Cookie的范围(不同域名)
  • 使用JS只能读写当前域或父域的Cookie,无法读写其他域的Cookie

4.Path路径

  • Path限定了访问Cookie的范围(同一个域名下)
  • 使用JS只能读写当前路径和上级路径的Cookie,无法读写下级路径的Cookie
    注意:当Name、Domain、Path这3个字段都相同的时候,才是同一个Cookie

Cookie的封装

1.封装

    // 写入 Cookie
    const set = (name, value, { maxAge, domain, path, secure } = {}) => {
        let cookieText = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
        // 判断 maxAge 是否是数字
        if (typeof maxAge === 'number') {
            cookieText += `; max-age=${maxAge}`;
        }
        // 判断 domian,path,secure 是否存在
        if (domain) {
            cookieText += `; domain=${domain}`;
        }
        if (path) {
            cookieText += `; path=${path}`;
        }
        if (secure) {
            cookieText += `; secure`;
        }
        document.cookie = cookieText;
    };
    //获取 Cookie
    const get = (name) => {
        name = `${encodeURIComponent(name)}`;
        const cookies = document.cookie.split('; ');
        for (const item of cookies) {
            const [cookieName, cookieValue] = item.split('=');
            if (cookieName === name) {
                return decodeURIComponent(cookieValue);
            }
        }
        return;
    };
    //删除 Cookie
    //根据 name、domain、path 来确定是否是同一个 Cookie
    const remove = (name, { domain, path } = {}) => {
        set(name, '', { domain, path, maxAge: -1 })
    };
   //导出
    export { set, get, remove };

2.使用封装的Cookie

  <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>中英文切换</title>
    </head>
    <body>
    <button id="cn">中文</button>
    <button id="en">英文</button>
    <script type="module">
        //导入封装的 cookie 模块
        import { set, get, remove } from "./cookie.js";
        const cnBtn = document.getElementById('cn');
        const enBtn = document.getElementById('en');
        // 绑定 cn 的 click 事件
        cnBtn.addEventListener('click', () => {
        // 设置 cookie
        set('language', 'cn', { maxAge: 30 * 24 * 3600 });
        // 使用 window 的 location 属性来刷新页面
        window.location = './index.html';
        }, false)
        // 绑定 en 的 click 事件
        enBtn.addEventListener('click', () => {
        set('language', 'en', { maxAge: 30 * 24 * 3600 })
        window.location = './index.html';
       }, false)
    </script>
    </body>
    </html>

Cookie的注意事项

  • 前后端都可以创建Cookie
  • Cookie有数量限制,每个域名下的Cookie数量有限,当超过单个域名限制之后,再设置Cookie,浏览器就会清除以前设置的Cookie
  • Cookie有大小限制,每个Cookie的存储容量很小,最多只有4KB左右
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值