会话控制-Session

Session

session 是什么?

session 是保存在 服务器端的一块儿数据,保存当前访问用户的相关信息

session 的作用

实现会话控制,可以识别用户身份,快速获取当前用户的相关信息

session 的运行流程

首先在浏览器中用户填写用户名和密码后请求发送给服务器,然后服务器对这个信息进行校验(一般查库),若通过的话,这时服务器会为当前的这个访问者创建一个对象 {},这个对象我们一般称为 session对象,而在这个对象里面会保存一些用户的基本信息,比如用户的用户名,用户id等,除此之外,后端还会在这个对象中生成一个独一无二的id标识,这个id我们称为 session_id,也叫会话id;有了这个session_id后,服务器就把这个信息以 响应cookie 的方式返回给浏览器,浏览器看到你把cookie返回后,它就会把cookie信息保存起来。
填写账号和密码校验身份,校验通过后创建 session 信息,然后将 session_id 的值通过响应头返回给浏览器,同时session对象的内容会存到一个容器中。

有了 cookie,下次发送请求时会自动携带cookie,服务器解析 cookie 中的 session_id 的值,然后拿着这个 sid 的值去 db(存放session对象的容器,一般为redis或者mysql等)中查找,如果在容器中找到了这个 sid,那么就可以进而获取到相关的username等信息,从而 确定用户的身份。

express中操作session

session 的设置

// 导入 express
const express = require('express');
// 导入 express-session https://www.npmjs.com/package/express-session
const session = require('express-session');
// 导入 connect-mongo express-session默认是把session存到了内存中,使用 connect-mongo 存到mongodb中
const MongoStore = require('connect-mongo');


// 创建应用对象
const app = express();

// 设置 session 的中间件
app.use(session({
    name: 'sid', // 设置cookie的name,默认值是: connect.sid
    secret: 'atguigu',  // 参与加密的字符串(又称签名)
    saveUninitialized: false,    // 是否为每次请求都设置一个cookie用来存储session的id
    resave: true,   // 是否在每次请求时重新保存session
    store: MongoStore.create({
        mongoUrl: 'mongodb://127.0.0.1/test'    // 数据库的连接配置
    }),
    cookie: {
        httpOnly: true, // 开启后前端无法通过 JS 操作,例如 document.cookie
        maxAge: 1000 * 60 // 这一条既是控制 cookie 的过期时间 也是控制 sessionID 的过期时间的!!!
    }
}))
// 创建路由规则
app.get('/', (req, res) => {
    res.send('home');
});


// 监听端口,启动服务
app.listen(3000, () => {
    console.log(`the server is running on 3000 ...`)
});

一定要启动 mongodb 服务,然后启动服务 nodemon 01-session.js, 访问地址:http://localhost:3000/
这时候你打开mongodb的test库,会发现多了一个集合:

现在这个 sessions 集合还是空的。

现在,我们新建一个路由规则,写入session信息
注意在访问这个路由时必须满足如下条件才会设置session信息

然后访问这个路由地址,这时候会发现在响应头中已经有session信息了:

这时候我们刷新下mongodb,就可以看到session信息存到里面了:

因此在将来,当你的请求中带有这个sessionid后,服务器在接收到解析后,去mongodb中查找就可以知道这个请求是谁发来的了。

session 的读取

访问购物车路由:

session 的销毁

cookie 和 session 的区别主要有如下几点:

  1. 存在的位置
  • cookie: 浏览器端
  • session:服务端
  1. 安全性
  • cookie 是以明文的方式存放在客户端的,安全性相对较低
  • session 存放于服务器中,所以安全性相对较好
  1. 网络传输量
  • cookie 设置内容过多会增大报文体积,会影响传输效率
  • session 数据存储在服务器,只是通过 cookie 传递 id,所以不影响传输效率
  1. 存储限制
  • 浏览器限制单个cookie保存的数据不能超过4K,且单个域名下的存储数量也有限制
  • session 数据存储在服务器中,所以没有这些限制

MongoDB安装[参考链接](https://blog.csdn.net/mghoumin/article/details/126899183)
posted @ 2023-08-10 23:25  LoremMoon  阅读(36)  评论(0编辑  收藏  举报