Session介绍

本文详细介绍了Session在Web开发中的作用、特点、产生过程,以及如何在Express中使用和管理。还探讨了Session与Cookie的关系,包括它们的协作、存储位置和有效期。同时,针对Session的本地存储和失效期管理进行了说明,以及Session对象的destroy方法的使用场景。
摘要由CSDN通过智能技术生成

1.Session是什么

Session 是一种在服务器端存储与特定用户或客户端相关信息的机制。是服务器中的一个对象,这个对象用来存储用户的数据。每一个session对象都有一个唯一的id,id会通过cookie的形式发送给客户端客户端每次访问时只需将存储有id的cookie发回即可获取它在服务器中存储的数据

2.Session的特点

Session主要特点包括

  1. 存储用户状态:包括登录信息、购物车等。
  2. 与特定用户关联:每个用户有独立的会话。
  3. 服务器端管理:增加安全性。
  4. 有时间限制:通常在一段时间后失效。

Session 的优点

  1. 提供个性化体验。
  2. 方便管理用户数据。

Session的缺点

  1. 性能影响:可能增加服务器负担。
  2. 会话超时处理:确保用户体验。
  3. 数据存储量:避免过大导致性能下降。
  4. 与 Cookie 配合:共同实现用户跟踪和识别。

3.Session的产生过程

  1. 客户端向服务器发送请求。
  2. 服务器接收到请求后,会为该客户端创建一个唯一的会话标识。
  3. 服务器将会话标识与客户端关联起来,并将相关数据(以对象的形式)存储在服务器端。
  4. 服务器将会话标识(只有客户端标识,没有数据)发送给客户端,通常以 Cookie 的形式。(服务器把cookie发送给客户端)
  5. 客户端接收到会话标识后,会在后续的请求中携带该标识(客户端保存并在发请求时带回给服务器)。
  6. 服务器通过会话标识识别客户端,并提供与该客户端相关的个性化服务和数据。

在这个过程中,服务器负责管理 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的关系

  1. 协作:它们通常一起使用,共同为用户提供个性化的服务和体验。
  2. 身份识别:Session 通过 Cookie 传递会话标识,以识别特定的用户或客户端。
  3. 数据存储:Cookie 可存储一些相对简单的数据,而 Session 用于存储更复杂或敏感的数据。
  4. 提高性能:结合使用可以减少服务器的负载,提高系统性能。
  5. 互补:各自具有优势,共同满足不同的需求。

例如,Cookie 可以在客户端快速访问和处理一些常用信息,而 Session 则在服务器端保证数据的安全性和完整性。
,Cookie 和 Session 相互配合,为 Web 应用提供了有效的用户状态管理和数据存储方式。

7.Session和Cookie的异同点

相同点:

  1. 都是用于存储用户相关的数据。
  2. 都可以帮助实现用户的个性化体验。

不同点:

  1. 存储位置:Cookie 存储在客户端,Session 存储在服务器端。
  2. 大小限制:Cookie 有大小限制,Session 对存储量的限制较小。
  3. 安全性:Session 相对更安全,Cookie 可能面临安全风险。
  4. 有效期:Cookie 可设置有效期,Session 有超时时间。
  5. 存储内容:Cookie 适合存储少量简单的数据,Session 可存储更复杂的数据。
  6. 对服务器的负担: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,使它立即失效,一般应用于当用户想要退出登录的时候。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值