Node.js会话控制cookie和session
1.会话控制是什么
HTTP协议是一个无状态的协议,它无法区分多次请求是否发送自同一客户端。
而我们在实际的使用中,却又大量的这种需求,我们需要通过会话的控制来解决该问题。
2.cookie
1.cookie是什么
cookie本质是一个存储在浏览器的文本,随着http请求自动传递给服务器。
也可以说cookie是一个头(请求头/响应头):
服务器以响应头的形式将Cookie发送给浏览器
浏览器收到以后会自动将Cookie保存
浏览器再次访问服务器时,会以请求头的形式将Cookie发回
服务器就可以通过检查浏览器发回的Cookie来识别出不同的浏览器
2 cookie的不足
各个浏览器对cookie的数量和大小都有不同的限制,这样就导致我们不能在Cookie中保存过多的信息。一般数量不超过50个,单个大小不超过4kb。
cookie是由服务器发送给浏览器,再由浏览器将cookie发回,如果cookie较大会导致发送速度非常慢,降低用户的体验
3.cookie的使用
// cookie-parser
//1. 安装 cookie-parser
// npm i cookie-parser
//2. 引入 cookie-parser
var cookieParser = require("cookie-parser");
//安装 express
//引入 express 包
const express = require("express");
//创建应用对象
const app = express();
//3. 设置中间件 cookie 方法中间件内部添加的
app.use(cookieParser());
//路由的设置
app.get("/", (request, response) => {
//设置响应
response.end("Hello Express");
});
//设置 cookie
app.get("/set-cookie", (request, response) => {
//4. 设置 cookie
response.cookie("email", "yunmuteach@163.com");
//设置带有时效性的 cookie 单位是毫秒
response.cookie("name", "yunmu", { maxAge: 1 * 60 * 1000 });
response.send("cookie的设置");
});
//获取 cookie
app.get("/get-cookie", (request, response) => {
//读取 cookie
console.log(request.cookies); //这里有 s 一定要注意
response.send("cookie 的读取");
});
//清空 cookie
app.get("/clear-cookie", (request, response) => {
response.clearCookie("email");
response.send("cookie 的清除");
});
//监听端口 启动服务
app.listen(80, () => {
console.log("服务已经启动.. 端口 80 监听中....");
});
注意:
- 发送请求时, 只会携带当前域名下的 cookie 进行请求
- cookie 在不同的浏览器之间是不共享的. 即使在同一台电脑
- cookie 是由服务器『响应』回来的 (响应头)
- set-cookie 中的 『path=/』 是设置此 cookie 生效的路径, / 表明此 cookie 在当前网站下都可用
- 带有时效性的 cookie, 关闭浏览器不会销毁此 cookie,过了指定时间销毁
- 不带时效性的 cookie, 关闭浏览器就会销毁, 如果不关闭浏览器, 此 cookie 就一直有效
3.session
1. session是什么
Session 是一个对象,存储特定用户会话所需的属性及配置信息。
2 session运作流程
我们可以在服务器中为每一次会话创建一个对象,然后每个对象都设置一个唯一的id,并将该id以cookie的形式发送给浏览器,然后将会话中产生的数据统一保存到这个对象中,这样我们就可以将用户的数据全都保存到服务器中,而不需要保存到客户端,客户端只需要保存一个id即可。
3.session的使用
const express = require("express");
//1. 安装 express-session
// npm i express-session
//2. 引入 模块
const session = require("express-session");
const app = express();
//3. 设置中间件
app.use(
session({
name: 'id22', //设置cookie的name,默认值是:connect.sid
secret: "keyboard cat", //参与加密的字符串(又称签名)
resave: false, //是否在每次请求时重新保存session
saveUninitialized: true, , //是否为每次请求都设置一个cookie用来存储session的id
cookie: {
httpOnly: true, // 开启后前端无法通过 JS 操作
maxAge: 1000*30 // 这一条 是控制 sessionID 的过期时间的!!!
},
})
);
//设置 session, 一般是用户在登录成功之后 会设置 session
app.get("/set-session", (request, response) => {
request.session.name = "yunmu";
request.session.email = "yunmuteacher@qq.com";
response.send("登录成功");
});
//读取 session 检测用户是否登录 会用到session的读取
app.get("/get-session", (request, response) => {
//读取session
//用户名
console.log("当前登录的用户为" + request.session.name);
console.log("当前登录的邮箱为" + request.session.email);
response.send("个人中心");
});
//session 的销毁
app.get("/destroy-session", (request, response) => {
//销毁session的方法
request.session.destroy(function () {
console.log("销毁成功");
response.send("安全退出登录");
});
});
app.get("/", (request, response) => {
response.end("Hello Express");
});
app.listen(80, () => {
console.log("服务已经启动.. 端口 80 监听中....");
});
4.cookie和session的区别
1.存在的位置
cookie 存在于客户端,临时文件夹中
ession 存在于服务器的内存中,一个session域对象为一个用户浏览器服务
2.安全性
cookie是以明文的方式存放在客户端的,安全性较低,可以通过一个加密算法进行加密后存放
session存放于服务器的内存中,所以安全性较好
3.网络传输量
cookie会传递消息给服务器
session本身存放于服务器,但是通过cookie传递id,会有少量的传送流量
4.生命周期(以20分钟为例)
cookie的生命周期是累计的,从创建时,就开始计时,20分钟后,cookie生命周期结束
session的生命周期是间隔的,从创建时, 开始计时如在20分钟,没有访问session,那么session生命周期被销毁;但是,如果在20分钟内(如在第19分钟时)访问过session,那么,将重新计算session的生命周期;关机会造成session生命周期的结束,但是对cookie没有影响
5.大小
cookie 保存的数据不能超过4K,很多浏览器都限制一个站点最多保存50个cookie
session 保存数据理论上没有任何限制(内存有多大就能有多大)