MicleMing.github.io

Blog: https://micleming.github.io/

View My GitHub Profile

cookie指的是用户终端存储的数据,通常最多能存储的大小是4kb。它可以用来存储用户的一些身份信息,借助session机制来进行身份验证。浏览器的每次请求,都会带上相应的cookie到服务器端。

cookie可以存储一些数据,也有一些属性对数据进行了描述。这些属性规定了数据的访问规则、过期规则等。通过这些属性来完成对cookie中数据的管理。cookie数据的属性包含以下几种:

cookie的操作

服务器端

cookie一般是由服务器端进行初始化,一个简单的设置cookie的格式可以用如下方式表示:

Set-Cookie: <cookie-name>=<cookie-value>

当用户代理发送一个请求时,在请求的response中可以这样设置:

response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript'])

如果服务器端设置了cookie,那么responsehttp报文一般可以是下面这个样子:

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: type=ninja
Set-Cookie: language=javascript
...

客户端

在浏览器获得这个response之后,便会在客户端种下一个cookie,利用document上的接口可以进行查看和修改, cookie的每个值通过分号来进行分隔

const cookies = document.cookie
console.log(cookies) // 'type=ninja;language=javascript'

如果你需要修改cookie, 那么可以可以利用这个接口

document.cookie = 'userId=123'

这时会给cookie加上一个userId的值。如果这个是否发一个http请求给服务器,那么这个请求便会带上cookie。请求报文可以是下面这个样子:

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: type=ninja; language=javascript; userId=123;
...

在开发过程中,一般会对document.cookie进行接口封装,以此来达到对简化对cookie的操作。如下是一个简单的封装:

class Cookie {
  setItem(value, config = {}) {
    const keys = Object.keys(config)
    const configStr = keys.map(k => `${k}=${config[key]}`).join(';')
    document.cookie = [escape(value), configStr].join(';')
  }
  getItem(key) {
    const cookie = document.cookie
    const cookieMap = cookie.split(';').reduce((acc, kv) => {
      const pairs = kv.split('=')
      acc[pairs[0]] = unescape(pairs[1])
      return acc
    }, {})
    return cookieMap[key]
  }
}

这样就可以通过getItemsetItem接口对cookie进行简单的操作。

参考资料