第十二章:会话控制

2024-06-19 02:36
文章标签 会话 第十二章 控制

本文主要是介绍第十二章:会话控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

会话控制

文章目录

  • 会话控制
    • 一、介绍
    • 二、cookie
      • 2.1 cookie 是什么
      • 2.2 cookie 的特点
      • 2.3 cookie 的运行流程
      • 2.4 浏览器操作 cookie
      • 2.5 cookie 的代码操作
        • (1)设置 cookie
        • (2)读取 cookie
        • (3)删除 cookie
    • 三、session
      • 3.1 session 是什么
      • 3.2 session 的作用
      • 3.3 session 运行流程
      • 3.4 session 的代码操作
        • (1)express-session 的安装与配置
        • (2)express 中 session 操作
    • 四、session 和 cookie 的区别
    • 五、token
      • 5.1 token 是什么
      • 5.2 token 的作用
      • 5.3 token 的工作流程
      • 5.4 token 的特点
      • 5.5 JWT
    • 六、附录
      • 6.1 本地域名
      • 6.2 修改域名
        • (1)操作流程
        • (2)原理

一、介绍

所谓会话控制就是 对会话进行控制

HTTP 是一种无状态的协议,它没有办法区分多次的请求是否来自于同一个客户端,无法区分用户

而产品中又大量存在的这样的需求,所以我们需要通过**会话控制**来解决该问题

常见的会话控制技术有三种:

  • cookie
  • session
  • token

二、cookie

2.1 cookie 是什么

cookie 是 HTTP 服务器发送到用户浏览器并保存在本地的一小块数据。简单的理解:

  • cookie 是保存在浏览器端的一小块数据
  • cookie 是按照域名划分保存的

简单示例:

域名cookie
www.baidu.coma=100;b=200
www.bilibili.comxid=1020abce121;hm=112411213
jd.comx=100;ocw=12414cce

2.2 cookie 的特点

  • 浏览器向服务器发送请求时,会自动将 当前域名下 可用的 cookie 设置在请求头中,然后传递给服务器
  • 这个请求头的名字也叫 cookie,所以将 cookie 理解为一个 HTTP 的请求头也是可以的

2.3 cookie 的运行流程

  1. 填写账号和密码校验身份,校验通过后下发 cookie

    服务器响应发cookie

  2. 有了 cookie 之后,后续再向服务器发生请求时,就会自动携带 cookie

    再次请求时携带cookie

2.4 浏览器操作 cookie

浏览器对 cookie 的操作,使用相对较少,了解即可

  1. 禁用所有 cookie
  2. 删除 cookie
  3. 查看 cookie

不同浏览器中的 cookie 是相互独立的,不共享

2.5 cookie 的代码操作

(1)设置 cookie
  • 不带时效性(会在浏览器关闭的时候,销毁

    res.cookie('键名', '键值')
    
  • 带时效性(通过 maxAge 设置 cookie 的存活时间,单位是毫秒

    // n 是一个数字,表示 n 毫秒
    res.cookie('键名', '键值', {maxAge: n})
    
  • 代码示例:

    // 导入 express
    const express = require('express')// 创建应用对象
    const app = express()// 设置 cookie
    app.get('/set-cookie', (req, res) => {// 不带时效性(会在浏览器关闭的时候,销毁)res.cookie('name', 'zhangsan')// 带时效性(通过 maxAge 设置 cookie 存活的时间,单位是毫秒)res.cookie('name', 'lisi', {maxAge: 30000})res.send('Cookie的设置')
    })// 启动服务
    app.listen(3000)
    
(2)读取 cookie
  1. 首先安装一个工具包 cookie-parser

    npm i cookie-parser
    
  2. 导入并使用 cookie-parser

    // 导入 cookie-parser(其实就是一个中间件)
    const cookieParser = require('cookie-parser')// 设置 cookieParser 中间件
    app.use(cookieParser())
    
  3. 使用 req.cookies 来读取 cookie。代码示例:

    // 导入 express
    const express = require('express')
    // 安装 cookie-parser       npm i cookie-parser
    // 导入 cookie-parser(其实就是一个中间件)
    const cookieParser = require('cookie-parser')// 创建应用对象
    const app = express()
    // 设置 cookieParser 中间件
    app.use(cookieParser())// 读取 cookie(要实现该效果,要安装一个工具包 cookie-parser)
    app.get('/get-cookie', (req, res) => {console.log(req.cookies)res.send('cookie的读取')
    })// 启动服务
    app.listen(3000)
    
(3)删除 cookie
  • 实现删除 cookie 只需要调用 clearCookie 方法即可

    res.clearCookie('键名')
    
  • 代码示例:

    // 导入 express
    const express = require('express')// 创建应用对象
    const app = express()// 删除 cookie
    app.get('/remove-cookie', (req, res) => {// 调用方法res.clearCookie('name')res.send('cookie的删除')
    })// 启动服务
    app.listen(3000)
    

三、session

3.1 session 是什么

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

3.2 session 的作用

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

3.3 session 运行流程

  1. 填写账号和密码校验身份,校验通过后创建 session 信息,然后将 session_id 的值通过响应头返回给浏览器

    返回session_id

  2. 有了 cookie,下次发生请求时会自动携带 cookie,服务器通过 cookie 中的 session_id 的值确定用户的身份

    通过session_id确定用户身份

3.4 session 的代码操作

(1)express-session 的安装与配置
  1. 首先安装 express-session 和 connect-mongo
npm i express-session connect-mongo
  1. 导入 express-session 和 connect-mongo
const session = require('express-session')
const MongoStore = require('connect-mongo')
  1. 设置 session 的中间件
app.use(session({name: 'sid',    //设置cookie的name,默认值是:connect.sidsecret: 'yuwenkai',   //参与加密的字符串(又称签名;加盐)saveUninitialized: false,   //是否为每次请求都设置一个cookie用来存储session的idresave: true,   //是否在每次请求时重新保存sessionstore: MongoStore.create({mongoUrl: 'mongodb://127.0.0.1:27017/mongoose_test'  //数据库的连接配置}),cookie: {httpOnly: true,  //开启后前端无法通过 JS 操作maxAge: 1000 * 60   //这一条是控制 sessionID 的过期时间的!!!}
}))
(2)express 中 session 操作
  • 设置 session
// 导入 express
const express = require('express')
// 导入 express-session connect-mongo
const session = require('express-session')
const MongoStore = require('connect-mongo')// 创建应用对象
const app = express()
// 设置 session 的中间件
app.use(session({name: 'sid',    //设置cookie的name,默认值是:connect.sidsecret: 'yuwenkai',   //参与加密的字符串(又称签名;加盐)saveUninitialized: false,   //是否为每次请求都设置一个cookie用来存储session的idresave: true,   //是否在每次请求时重新保存sessionstore: MongoStore.create({mongoUrl: 'mongodb://127.0.0.1:27017/mongoose_test'  //数据库的连接配置}),cookie: {httpOnly: true,  //开启后前端无法通过 JS 操作maxAge: 1000 * 60 * 5   //这一条是控制 sessionID 的过期时间的!!!}
}))// 设置 session
app.get('/login', (req, res) => {if(req.query.username === 'admin' && req.query.password === '123456') {// 设置 session 信息req.session.username = 'admin'req.session.uid = '25gtf414g9u8o'res.send('登录成功')}else {res.send('登录失败')}
})// 启动服务 
app.listen(3000)
  • 获取 session
// 导入 express
const express = require('express')
// 导入 express-session connect-mongo
const session = require('express-session')
const MongoStore = require('connect-mongo')// 创建应用对象
const app = express()
// 设置 session 的中间件
app.use(session({name: 'sid',    //设置cookie的name,默认值是:connect.sidsecret: 'yuwenkai',   //参与加密的字符串(又称签名;加盐)saveUninitialized: false,   //是否为每次请求都设置一个cookie用来存储session的idresave: true,   //是否在每次请求时重新保存sessionstore: MongoStore.create({mongoUrl: 'mongodb://127.0.0.1:27017/mongoose_test'  //数据库的连接配置}),cookie: {httpOnly: true,  //开启后前端无法通过 JS 操作maxAge: 1000 * 60 * 5   //这一条是控制 sessionID 的过期时间的!!!}
}))// 获取 session
app.get('/cart', (req, res) => {console.log(req.session.uid)if(req.session.username) {res.send(`购物车页面,欢迎${req.session.username}登录`)}else {res.send('登录失败')}
})// 启动服务 
app.listen(3000)
  • 销毁 session
// 导入 express
const express = require('express')
// 导入 express-session connect-mongo
const session = require('express-session')
const MongoStore = require('connect-mongo')// 创建应用对象
const app = express()
// 设置 session 的中间件
app.use(session({name: 'sid',    //设置cookie的name,默认值是:connect.sidsecret: 'yuwenkai',   //参与加密的字符串(又称签名;加盐)saveUninitialized: false,   //是否为每次请求都设置一个cookie用来存储session的idresave: true,   //是否在每次请求时重新保存sessionstore: MongoStore.create({mongoUrl: 'mongodb://127.0.0.1:27017/mongoose_test'  //数据库的连接配置}),cookie: {httpOnly: true,  //开启后前端无法通过 JS 操作maxAge: 1000 * 60 * 5   //这一条是控制 sessionID 的过期时间的!!!}
}))// 销毁 session
app.get('/logout', (req, res) => {req.session.destroy(() => {res.send('退出成功')})
})// 启动服务 
app.listen(3000)

四、session 和 cookie 的区别

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

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

五、token

5.1 token 是什么

token 是服务端生成并返回给 HTTP 客户端的一串加密字符串,token 中保存着 用户信息

5.2 token 的作用

实现会话控制,可以识别用户的身份,主要用于移动端 APP

5.3 token 的工作流程

  1. 填写账号和密码校验身份,校验通过后响应 token,token 一般是在响应体中返回给客户端的

    响应token

  2. 后续发送请求时,需要手动将 token 添加到请求报文中,一般是放在请求头中

    添加token到请求报文中

5.4 token 的特点

  1. 服务端压力更小
    • 数据存储在客户端
  2. 相对更安全
    • 数据加密
    • 可以避免 CSRF(跨站请求伪造)
  3. 扩展性更强
    • 服务间可以共享
    • 增加服务节点更简单

5.5 JWT

JWT(JSON Web Token)是目前最流行的跨域认证解决方案,可用于基于 token 的身份验证

JWT 使 token 的生成与校验更规范,我们可以使用 jsonwebtoken 包 来操作token

  1. 安装 jsonwebtoken 包

    npm i jsonwebtoken
    
  2. 代码示例:

    // 导入 jwt
    const jwt = require('jsonwebtoken')// 创建(生成)token
    // let token = jwt.sign(用户数据, 加密字符串, 配置对象)
    let token = jwt.sign({username: 'zhangsan'
    }, 'yuwenkai', {expiresIn: 60   //单位是秒
    })console.log(token)// 校验token
    // jwt.verify(token, 加密字符串, 回调函数)
    jwt.verify(token, 'yuwenkai', (err, data) => {if(err) {console.log('校验失败!')return}console.log(data)
    })
    

扩展阅读:JSON Web Token 入门教程

六、附录

6.1 本地域名

所谓本地域名就是 只能在本机使用的域名,一般在开发阶段使用

6.2 修改域名

我们可以通过对 hosts 文件进行修改本地域名

(1)操作流程

编辑文件 C:\Windows\System32\drivers\etc\hosts

127.0.0.1		www.ywk.com

如果修改失败,可以修改该文件的权限

修改文件权限

(2)原理

在地址栏输入 域名 之后,浏览器会先进行 DNS(Domain Name System)查询,获取该域名对应的 IP 地址

请求会发送到 DNS 服务器,可以 根据域名返回 IP 地址

可以通过 ipconfig /all 查看本机的 DNS 服务器

hosts 文件也可以设置域名与 IP 的映射关系,在发送请求前,可以通过该文件获取域名的 IP 地址

这篇关于第十二章:会话控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073766

相关文章

Java研学-RBAC权限控制(八)

九 登录登出 1 登录作用   判断员工是否有权限访问,首先得知道现在操作的人是谁,所以必须先实现登录功能 2 登录流程   ① 提供登录页面,可输入用户名与密码信息,并添加执行登录的按钮。(登录页面不能被拦截)   ② 给按钮绑定点击事件(异步操作,POST请求)   ③ 事件中发送登录请求,使用 AJAX 方式提交。(使用 AJAX 原因:用户体验更好,既可保留用户刚输入的用户名和密码

ROS2从入门到精通4-4:局部控制插件开发案例(以PID算法为例)

目录 0 专栏介绍1 控制插件编写模板1.1 构造控制插件类1.2 注册并导出插件1.3 编译与使用插件 2 基于PID的路径跟踪原理3 控制插件开发案例(PID算法)常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 🚀详情:《ROS2从入门到精通》 1 控制插

MQTT之CONNECT控制报文详解

目录 1.  MQTT协议规范 2.  名词解释 3.  CONNECT控制报文详解 3.1  固定报头 Fixed header 3.2  可变报头 Variable header 3.2.1  协议名 Protocol Name 3.2.2  协议级别 Protocol Level 3.2.3  连接标志 Connect Flags 3.2.4  保持连接 Keep

STM32单片机PWR电源控制详解

文章目录 1. PWR概述 2. 电源结构框图 3. 上电复位和掉电复位 4. 可编程电压监测器 5. 低功耗模式 6. 模式选择 6.1 睡眠模式 6.2 停止模式 6.3 待机模式 7. 代码示例 1. PWR概述 PWR(Power Control)电源控制,负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能。 可编程电压监测器

基于动力学的六自由度机器人阻抗恒力跟踪控制

1.整个代码的控制流程图如下: 2.正逆运动学计算 略 3.动力学模型 采用拉格朗日法计算机械臂的动力学模型,其输入的是机械臂的关节角度、角速度和角加速度;其中M、C、G本别是计算的惯性力、科式力和重力项,相关部分如下: 4.RBF神经网络自适应参数调节 采用RBF自适应调节阻抗控制器参数,末端每个方向单独进行参数的调整,其中rbf的输入的是力和位置,输出的是阻抗控制器的参数,rb

LabVIEW编程控制ABB机械臂

使用LabVIEW编程控制ABB机械臂是一项复杂但十分有价值的任务。通过LabVIEW,可以实现对机械臂的精确控制和监控,提升自动化水平和操作效率。 1. 项目规划和硬件选型 1.1 确定系统需求 运动控制:确定机械臂需要执行的任务,如抓取、搬运、装配等。 传感器集成:确定需要集成的传感器,如位置传感器、力传感器、视觉传感器等。 通讯接口:确定与ABB机械臂控制器的通讯接口,如Ethe

【Vite】控制打包结构

配置 vite.config.json 文件: import { defineConfig } from "vite";export default defineConfig({// ...build: {rollupOptions: {output: {entryFileNames: "js/[name]-[hash].js",chunkFileNames: "js/[name]-[hash]

LabVIEW 控制 Tucsen 相机

LabVIEW 控制 Tucsen 相机 ucsen 是一家知名的显微镜相机制造商,其相机产品广泛应用于科研、工业和医疗等领域。本文将介绍如何使用 LabVIEW 软件来控制 Tucsen 相机,涵盖相机的基本情况、硬件和软件要求、具体的控制步骤和编程示例。通过使用 LabVIEW,可以实现相机的图像采集、处理和分析,增强实验和工业应用的效率和精度。 一、Tucsen 相机概况 1.1 相机

biostar handbook(五)|序列从何而来和质量控制

测序仪 2017年一篇发表在Nature的综述"DNA sequencing at 40: past, present and future"介绍了DNA测序这40年的发展历程。1976年,Sanger和Coulson同时发表了2种方法用于对上百个DNA碱基进行解码,这就是第一代测序技术。到了2005年,罗氏的454平台揭开了高通量测序的序幕,后面则是SOLiD,454和Illumina三方对抗

控制下属很简单,用好这3大管人绝招,再跳的刺头也不敢造次

控制下属很简单,用好这3大管人绝招,再跳的刺头也不敢造次 第一招:给压力   很多团队中的员工都是自己不带脑子工作,遇事就喜欢请示领导,让领导拿方案、拿决策。 还有一些人,推一下,他才动一下,根本不够主动。 长此以往,员工缺乏思考,也懒得思考,就等着领导发号施令,自然也就不愿意承担工作上的责任,能力和执行力也很难得到提升。 所以,要尝试着改变员工安逸的工作环境,给他们压力,他们才能动起来。具体的做