Node.js会话控制cookie和session

1,402 阅读5分钟

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 监听中....");
});

注意:

  1. 发送请求时, 只会携带当前域名下的 cookie 进行请求
  2. cookie 在不同的浏览器之间是不共享的. 即使在同一台电脑
  3. cookie 是由服务器『响应』回来的 (响应头)
  4. set-cookie 中的 『path=/』 是设置此 cookie 生效的路径, / 表明此 cookie 在当前网站下都可用
  5. 带有时效性的 cookie, 关闭浏览器不会销毁此 cookie,过了指定时间销毁
  6. 不带时效性的 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 保存数据理论上没有任何限制(内存有多大就能有多大)