1. 为什么要用cookie或session
因为http协议是无状态协议(没有记忆功能),当我们使用了cookie或session这些技术后,就可以让我们的系统有记忆的功能
2. cookie的认识
- 本质就是一个字符串,里面包含浏览器和服务器的沟通信息(交互产生的信息)。
- 存储的形式:key-value的形式存储
- 浏览器会自动携带该网站下的全部cookie到服务器端。
3. cookie的分类:
- 会话cookie:
- 后台设置cookie时,没有设置maxAge的cookie默认是会话cookie
- 会话cookie存储在浏览器运行的那块内存上
- 关闭浏览器后,会话cookie会自动消失
- 持久化cookie:
- 后台设置cookie时,设置了maxAge的cookie
- 存在用户的硬盘上
- 看过期时间,一旦过了过期时间,自动销毁。
- 如果没有到过期时间,但用户清理了,cookie也会消失
4. cookie的工作原理:
- 当浏览器第一次请求服务器的时候,服务器可能返回一个或多个cookie给浏览器
- 浏览器判断cookie的种类:
- 会话cookie:存储在浏览器运行的那块内存上
- 持久化cookie:存储在用户的硬盘上
- 以后请求该服务器的时候,自动携带上该网站的所有cookie(无法进行干预)
- 服务器拿到之前自己种下的cookie,分析里面的内容,校验cookie的合法性,根据cookie里保存的内容,进行具体的业务逻辑
5. 注意:
不同的语言,不同的后端架构cookie的具体语法不一样。但是cookie原理和工作过程是不变的
6. 设置cookie
- 通过响应对象设置cookie:res.cookie(key, value, option)即可,设置多个cookie,则调用多次res.cookie()。
- 必须在res.send()前调用res.cookie()。
- option配置属性:
- maxAge: cookie的有效时间,单位是毫秒
- httpOnly: true则只能服务器访问cookie,客户端不能访问(客户端访问cookie用document.cookie,是一个字符串,格式位“key1=val1; key2=val2; …" )
- path: cookie只能在某个路径中使用
- domain:设置cookie只能在某个域名中使用
7. 获取cookie:
需要用到第三方的cookie-parser中间件
安装cookie-parser:npm install cookie-parser
使用:let cookieParser = require(“cookie-parser”);
app.use(cookieParser());
通过请求对象获取cookie:req.cookies.xxx;
8.代码示例:
const express = require("express");
const app = express();
//获取cookie的中间件,将客户端的cookie解析到req.cookies属性上
const cookieParser = require("cookie-parser");
//设置cookie
app.get("/setcookie", (req, res)=>{
res.cookie.name = 'zhangsan';
res.cookie.age = 12;
res.send("设置cookie")
});
//获取cookie
app.get("/getcookie", (req, res)=>{
console.log(req.cookies.name);
console.log(req.cookies.age);
res.send("获取cookie");
})