文章目录
1.Session是什么
Session 是一种在服务器端存储与特定用户或客户端相关信息的机制
。是服务器中的一个对象,这个对象用来存储用户的数据。每一个session对象都有一个唯一的id,id会通过cookie的形式发送给客户端客户端每次访问时只需将存储有id的cookie发回即可获取它在服务器中存储的数据
2.Session的特点
Session主要特点包括
- 存储用户状态:包括登录信息、购物车等。
- 与特定用户关联:每个用户有独立的会话。
- 服务器端管理:增加安全性。
- 有时间限制:通常在一段时间后失效。
Session 的优点
- 提供个性化体验。
- 方便管理用户数据。
Session的缺点
- 性能影响:可能增加服务器负担。
- 会话超时处理:确保用户体验。
- 数据存储量:避免过大导致性能下降。
- 与 Cookie 配合:共同实现用户跟踪和识别。
3.Session的产生过程
- 客户端向服务器发送请求。
- 服务器接收到请求后,会为该客户端创建一个唯一的会话标识。
- 服务器将会话标识与客户端关联起来,并将相关数据(以对象的形式)存储在服务器端。
- 服务器将会话标识(只有客户端标识,没有数据)发送给客户端,通常以 Cookie 的形式。(服务器把cookie发送给客户端)
- 客户端接收到会话标识后,会在后续的请求中携带该标识(客户端保存并在发请求时带回给服务器)。
- 服务器通过会话标识识别客户端,并提供与该客户端相关的个性化服务和数据。
在这个过程中,服务器负责管理 Session,包括创建、存储、更新和销毁等操作。客户端通过携带会话标识来与服务器进行交互,从而实现用户状态的维持和个性化服务的提供。
当我们在代码里面引入Session之后,服务器会给浏览器自动发送一个Cookie(包裹在Session对象里面),这个Cookie就是Session所创建的cookie,cookie里的Name就是服务器给客户端的标识ID,接下来我们就可以用req来操作Session了。
4.Session的用法
1.安装依赖
yarn add express-session -D
npm install express-session
2.引入依赖
const session = require(‘express-session’)
3.注册在中间件use中
app.use(session({
secret: “yuanshenqidong”
}))
Session依赖里面传入一个配置对象,需要设置一个secret,用于对 Session 数据进行加密和解密,以确保数据的安全性。
5.具体示例
简单打印一下Session对象
const express = require('express')
const session = require('express-session')
const path = require('node:path')
const app = express()
app.use(express.static(path.resolve(__dirname, './public')))
app.set('view engine', 'ejs')
app.set('views', path.resolve(__dirname, 'views'))
app.use(express.urlencoded({ extended: true }))
app.use(session({
secret: "yuanshenqidong"
}))
app.get('/ys', (req, res) => {
// res.render('y')
const seon = req.session
res.send(seon)
})
app.listen(7000, () => {
console.log("监听成功")
})
接下来我们在Session里面加入表单提交的用户信息
const express = require('express')
const session = require('express-session')
const path = require('node:path')
const app = express()
app.use(express.static(path.resolve(__dirname, './public')))
app.set('view engine', 'ejs')
app.set('views', path.resolve(__dirname, 'views'))
app.use(express.urlencoded({ extended: true }))
app.use(session({
secret: "yuanshenqidong"
}))
app.get('/ys', (req, res) => {
res.render('y')
})
app.post('/sub', (req, res) => {
if (req.body.name == '钟离' && req.body.password == '123') {
req.session.name = '钟离'
req.session.password = '123'
res.redirect('/identify')
} else {
res.send("你没有钟离吗???")
}
})
app.get('/identify', (req, res) => {
// 如果req.session.name和req.session.password都存在
if (req.session.name && req.session.password) {
const seon = req.session
res.send(seon)
res.send("你的身份没有问题!!!")
} else {
res.redirect('/')
}
})
app.listen(7000, () => {
console.log("监听成功")
})
这里可以看到我们写入的信息已经在cookie里面了,而cookie在Session对象里面。
6.Session和Cookie的关系
- 协作:它们通常一起使用,共同为用户提供个性化的服务和体验。
- 身份识别:Session 通过 Cookie 传递会话标识,以识别特定的用户或客户端。
- 数据存储:Cookie 可存储一些相对简单的数据,而 Session 用于存储更复杂或敏感的数据。
- 提高性能:结合使用可以减少服务器的负载,提高系统性能。
- 互补:各自具有优势,共同满足不同的需求。
例如,Cookie 可以在客户端快速访问和处理一些常用信息,而 Session 则在服务器端保证数据的安全性和完整性。
,Cookie 和 Session 相互配合,为 Web 应用提供了有效的用户状态管理和数据存储方式。
7.Session和Cookie的异同点
相同点:
- 都是用于存储用户相关的数据。
- 都可以帮助实现用户的个性化体验。
不同点:
- 存储位置:Cookie 存储在客户端,Session 存储在服务器端。
- 大小限制:Cookie 有大小限制,Session 对存储量的限制较小。
- 安全性:Session 相对更安全,Cookie 可能面临安全风险。
- 有效期:Cookie 可设置有效期,Session 有超时时间。
- 存储内容:Cookie 适合存储少量简单的数据,Session 可存储更复杂的数据。
- 对服务器的负担:Cookie 对服务器负担较小,Session 可能增加服务器负担。
在实际应用中,通常会根据具体需求选择使用 Cookie 还是 Session,或者结合使用以达到更好的效果。
8.Session的失效期
发现一个问题,当我们把浏览器关闭或者刷新服务器的时候,我们的登录信息就没有了,我们这个时候需要重新登陆,是为什么?
因为我们关闭浏览器的话,cookie就失效了(默认有效期一个会话),如果刷新浏览器的话,Session就会失效。因为Session依赖cookie,所以两者任意一方失效,登录信息就不存在了,用户就需要重新登录。
我们可以通过设置Session和cookie的有效期来解决这个问题
app.use(session({
//Session的配置对象里面有很多参数,secret是必填项
store: new fileStore({
// 设置本地文件的存储路径
path: path.resolve(__dirname, './session'),
// 设置数据加密(它是设置本地文件信息的加密,与外层的secret不同)
secret: 'nihao',
// 设置Session的有效时间(单位秒),默认是3600秒(最大闲置时间)
// 适用于设置用户登录状态的有效期,比如一个月未登录则信息失效重新登陆
ttl: 20
}),
secret: "yuanshenqidong",
//cookie配置项,通过Session设置cookie的相关信息
cookie: {
// 在Session里面设置cookie的失效期
maxAge: 1000 * 60
}
}))
9.Session本地存储
为了防止刷新服务器而导致的Session失效的问题,我们使用 session-file-store 中间件将Session存储到本地。
1.安装模块
yarn add seesion-file-store -D
npm install seesion-file-store
2.引入模块
const fileStore = require(‘seesion-file-store’)(Session)
参数的session是我们上面引入的Session,我们要告诉这个存储仓库,我们引入的是哪个Session
3.注册在中间件use中
app.use(session({
store: new fileStore({
// 设置本地文件的存储路径
path: path.resolve(__dirname, './session'),
// 设置数据加密
secret: 'nihao',
// 设置Session的有效时间(单位秒),默认是3600秒(最大闲置时间)
// 适用于设置用户登录状态的有效期,比如一个月未登录则信息失效重新登陆
ttl: 20
}),
secret: "yuanshenqidong",
cookie: {
// 在Session里面设置cookie的失效期
maxAge: 1000 * 60
}
}))
- 每次Session失效客户端进行重新登录的时候,本地都会产生一个失效的Session文件,虽然内存不大,但是随之数量增多,也会很占内存,不过Session默认每隔一个小时会清空过期文件,我们可以通过reapInterval(单位秒)来设置间隔时间。
store: new fileStore({
// 设置本地文件的存储路径
path: path.resolve(__dirname, './session'),
// 设置数据加密
secret: 'nihao',
// 设置Session的有效时间(单位秒),默认是3600秒(最大闲置时间)
// 适用于设置用户登录状态的有效期,比如一个月未登录则信息失效重新登陆
ttl: 20,
// 设置每隔10秒清除一次过期Session文件
reapInterval:10
}),
Session对象身上的destroy方法(需要一个回调函数作为参数)
这个方法可以是销毁Session,使它立即失效,一般应用于当用户想要退出登录的时候。