第十二章:会话控制

会话控制

文章目录

  • 会话控制
    • 一、介绍
    • 二、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.mzph.cn/diannao/29901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【1】、var、let、const 三者的区别

主要围绕一下五个方面 变量提升暂时性死区块级作用域重复声明修改声明的变量 1、变量的提升 【var】可以在声明前使用,即输出为undefined 【let】和【const】未声明不可使用,否则会报错 2、暂时性死区定义:在代码块内,如果引用…

港硕上岸鹅厂算法岗,谈谈感受和心得!

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

5个好用的AI绘画软件推荐,小白也能轻松上手

前言 随着人工智能技术的飞速发展,AI绘画软件已经成为艺术创作领域的新宠。这些软件不仅能够提供强大的绘画辅助功能,而且操作简便,即使是绘画新手也能轻松上手。本文将为您推荐5款好用的AI绘画软件,帮助您开启艺术创作的大门。 …

CAN总线仲裁(四)

​ 多设备同时发送遇到的问题 CAN总线只有一对差分信号线,同一时间只能有一个设备操作总线发送数据,若多个设备同时有发送需求,该如何分配总线资源? 解决问题的思路:制定资源分配规则,依次满足多个设备的…

PLC通过Profibus协议转Modbus协议网关接LED大屏通讯

一、背景 Modbus协议和Profibus协议是两种常用于工业控制系统的通信协议,它们在自动化领域中起着重要的作用。Modbus是一种串行通信协议,被广泛应用于各种设备之间的通信,如传感器、执行器、PLC等。而Profibus则是一种现场总线通信协议&…

基于YOLOv5m的地面飞机及油罐的目标识别(附数据集和Coovally操作步骤)

本文主要内容:详细介绍了利用无人机拍摄的地面停靠的飞机机体以及油罐,进行识别,整个过程从创建数据集到训练模型再到预测结果全部可视化操作与分析。 文末有数据集获取方式,请先看检测效果 现状 飞机识别,在军事侦察、航空安全监…

各国内AI大厂推进大模型的阶段

2022 年 11 月,美国 AI 公司 Open AI 发布旗下 AI 聊天机器人程序 ChatGPT,该程序基于大型语言模型(LLM,Large Language Model) GPT-3.5,使用指令微调 (Instruction Tuning)和基于人…

一招教你房间内灰尘多怎么处理?除粉尘好用的空气净化器分享

在你吸尘、扫地、擦家具的时候,你或许会奇怪,为什么灰尘每天擦,每天有?即使门窗关得好好的,过几天还是会落上一层薄薄的灰。它们究竟是什么?对我们的健康又有什么影响呢?我们每天生活在房屋中&a…

Gotchi 战士们准备好吧!稀有度挖矿第八季锦标赛即将开始!

我们很高兴地宣布稀有度挖矿第 8 赛季的比赛即将开始,比赛将设立 15 万 GHST 的巨额奖金池,同时还将进行新的更新,让您有更多的方式来制定战略并与您的小鬼好友们一较高下。 本赛季引入了双败淘汰赛,每支队伍可以有两名替补队员&a…

vite项目配置高德api定位功能

项目场景: 用vite项目集成了一个H5页面的小程序,需要调用高德的定位API,在浏览器中测试的时候,出现了一系列定位失败的情况。 问题1 Get ipLocation failed、Geolocation permission denied 本地http访问下,定位失败…

基于PHP的草莓种植信息管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的草莓种植管理系统 一 介绍 此草莓种植管理系统基于原生PHP开发,数据库mysql,前端采用jquery.js和kindeditor在线HTML编辑器。系统角色分为用户和管理员。 技术栈:phpmysqljquery.jsphpstudyvsco…

在评论区的小发现

大约是近期比较频率的缘故,今天收到了系统私信,说我入围了本市博主周榜top100名单。本着虚心学习的态度,我打开了榜单。发现前几名获赞、阅读、评论都比我高多了。于是打开人家的主页,想拜读一下人家的文章。从内容上看&#xff0…

压测怎么做?如何自动化?盘点各大公司全链路压测方案与实践

本文综合盘点各大公司团队的全链路压测技术方案和实践路径,供大家参考。 一、什么是全链路压测? 全链路压测指的是基于实际的生产业务场景、系统环境,模拟海量的用户请求和数据对整个业务链进行压力测试,并持续调优的过程。常用…

comfyui虚拟试衣、ai换装、电商换装源码

一、AI换装技术博客 1. 项目介绍 IDM-VTON 是一个虚拟试衣模型,可以在 ComfyUI 中进行部署。相比于其他虚拟试衣模型,如 OOTDiffusion,IDM-VTON 提升了图像保真度和细节保留,更强调真实感,而且就算是侧面的模特或者背面的模特都…

【Ubuntu】--- 创建用户 删除用户 及其他用户操作大全 持续更新中

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【Ubuntu】--- 创建用户 删除用户 及其他…

c++中string用法详解

目录 二、案例需求 三、案例实现 1.首先获取strData中的角色数量 2.创造结构体数组,定义两个索引值 3.循环遍历对结构体User中的Id和Exp进行赋值 4.对结构体数组userArr进行排序 5.展示结果以及最终代码 ​四、最后 一、前言 在C中,std::string …

【Git】多人协作 -- 详解

一、多人协作(1) ⽬前,我们所完成的工作如下: 基本完成 Git 的所有本地库的相关操作,git 基本操作,分支理解,版本回退,冲突解决等等。 申请码云账号,将远端信息 clone…

(微服务实战)聚合支付系统商户线上聚合收银台接口设计

1 概述 聚合支付收款分为线上和线下业务场景,本文中的商户收银台接口设计主要是指线上业务场景,线下业务场景聚合收款方式后续会进行单独设计和分析。 主流的线上支付渠道有微信支付,支付宝支付,云闪付。这三种支付渠道都有各自…

Linux操作系统学习:day04

内容来自:Linux介绍 视频推荐:[Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试]( 目录 day0422、通过文字设定法修改用户对文件的操作权限23、通过数字设定法修改文件的权限24、修改文件所有者和所属组25、tree—查看目录内…

Notes客户机开启事务日志

大家好,才是真的好。 了解过事务日志的人都知道——等等,你还不知道事务日志? 那我们先介绍一下,简单来说,Domino事务日志是捕获数据库更改并将其写入的记录,然后等服务器不繁忙或按计划更新到磁盘上的No…