会话控制-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 的销毁
session 和 cookie 的区别
cookie 和 session 的区别主要有如下几点:
- 存在的位置
- cookie: 浏览器端
- session:服务端
- 安全性
- cookie 是以明文的方式存放在客户端的,安全性相对较低
- session 存放于服务器中,所以安全性相对较好
- 网络传输量
- cookie 设置内容过多会增大报文体积,会影响传输效率
- session 数据存储在服务器,只是通过 cookie 传递 id,所以不影响传输效率
- 存储限制
- 浏览器限制单个cookie保存的数据不能超过4K,且单个域名下的存储数量也有限制
- session 数据存储在服务器中,所以没有这些限制
MongoDB安装[参考链接](https://blog.csdn.net/mghoumin/article/details/126899183)
本文来自博客园,作者:LoremMoon,转载请注明原文链接:https://www.cnblogs.com/hello-cnblogs/p/17621692.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下