Node 会话控制

news2024/9/24 13:22:29

文章目录

  • Node 会话控制
    • 概述
    • cookie
      • 运行流程
      • 设置cookie
      • 获取cookie
      • 删除cookie
    • session
      • 运行流程
      • 设置session
      • 获取session
      • 删除session
    • session和cookie的区别
    • token
      • 运行流程
      • JWT
      • 创建token
      • 校验token

Node 会话控制

概述

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

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

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

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

  • cookie
  • session
  • token

cookie

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

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

运行流程

当用户访问网站时,服务器将cookie设置在请求头中,然后发送到浏览器,浏览器将其存储在本地,在以后的请求中将其放在请求中发送给服务器。

设置cookie

const express = require("express");

const app = express();

// 设置cookie
app.get("/set_cookie", (request, response) => {
  response.cookie("name", "Tom");
  response.cookie("age", 18, { maxAge: 5 * 60 * 1000 }); //最长时效4分钟
  response.send("设置cookie");
});

app.listen(3000, () => {
  console.log("服务器启动了");
});

第一次调用 http://127.0.0.1:3000/set_cookie,服务器会返回set-cookie字段:

在这里插入图片描述

第二次调用 http://127.0.0.1:3000/set_cookie,浏览器会将可用的cookie放在请求头并发送到服务器:

在这里插入图片描述

获取cookie

需要安装cookie-parser包:

npm install cookie-parser

设置cookieParser中间件:

const express = require("express");
const cookieParser = require("cookie-parser");

const app = express();

// 设置cookie-parser中间件
app.use(cookieParser());

// 获取cookie
app.get("/get_cookie", (request, response) => {
  console.log(request.cookies);
  response.send("获取cookie"); //{ name: 'Tom', age: '18' }
});

app.listen(3000, () => {
  console.log("服务器启动了");
});

删除cookie

const express = require("express");

const app = express();

// 删除cookie
app.get("/delete_cookie", (request, response) => {
  response.clearCookie("name");
  response.send("删除cookie");
});

app.listen(3000, () => {
  console.log("服务器启动了");
});

session

session是保存在服务器的。

运行流程

当用户访问网站时,服务器会创建一个新的session并与用户关联,服务器可以将session保存在服务器,接着服务器通过cookie将session_id的值通过响应头发送给浏览器,浏览器保存其cookie,下次请求是就会自动携带cookie发送到服务器,服务器通过cookie中的session_id确定用户信息。

安装express-session中间件:

npm i express-session

安装connect-mongo中间件:

npm i connect-mongo

设置session

const express = require("express");
const session = require("express-session");
const MongoStore = require("connect-mongo");

const app = express();

app.use(
  session({
    name: "sessionId", //设置cookie的name
    secret: "hello", //加密字符串
    saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的id
    resave: true, //是否每次请求时重新保存session
    store: MongoStore.create({
      mongoUrl: "mongodb://127.0.0.1:27017/mydb",
    }),
    cookie: {
      httpOnly: true, //开启后前端不能通过js操作
      maxAge: 1000 * 300, //过期时间
    },
  })
);

// 设置session
app.get("/set_session", (request, response) => {
  request.session.username = "Tom";
  request.session.age = 18;
  response.send("设置session");
});

app.listen(3000, () => {
  console.log("服务器启动了");
});

说明:第一次调用 http://127.0.0.1:3000/set_session,服务器将sessionId放在cookie中,并返回给浏览器。

在这里插入图片描述

第二次调用 http://127.0.0.1:3000/set_session,浏览器将cookie发送到服务器,cookie中包含sessionId。

在这里插入图片描述

获取session

// 获取session
app.get("/get_session", (request, response) => {
  console.log(request.session);
  console.log(request.session.username); //Tom
  response.send("获取session");
});

删除session

// 删除session
app.get("/delete_session", (request, response) => {
  request.session.destroy(() => {
    response.send("删除session");
  });
});

session和cookie的区别

cookiesession
存放位置浏览器服务器
安全性cookie以明文方式保存在浏览器,安全性较低session存放在服务器中,安全性相对较高
网络传输量内容过多会影响传输效率数据存储在服务器,只是通过cookie传递id,不影响传输效率
存储限制浏览器限制单个 cookie 保存的数据不能超过 4K ,且每个域名下的存储数量也有限制服务器可以将session数据存储在内存中,也可以将其存储在数据库或文件系统中。
用处存储较小的数据,如用户首选项或购物车信息存储较大的数据,如用户身份验证信息

token

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

token可以识别用户的身份,主要用于移动端 APP。

token 的特点

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

运行流程

当用户访问网站填写了账号和密码,服务器通过身份校验后生成token,token通过响应体返回给浏览器,浏览器在以后的请求中需要手动加上token发送到服务器。

JWT

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

JWT 使 token 的生成与校验更规范。

安装jsonwebtoken包:

npm i jsonwebtoken

创建token

// 导包
const jwt = require("jsonwebtoken");

// 创建token
let token = jwt.sign(
  {
    username: "Tom",
    age: 18,
  },
  "helloworld",
  {
    expiresIn: 60, //单位秒
  }
);
console.log(token);

校验token

jwt.verify(token, "helloworld", (err, data) => {
  if (err) {
    console.log("校验失败");
    return;
  }
  console.log(data);
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430910.html

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

相关文章

DAY 38 LINUX iptables防火墙

所谓防火墙也称之为防护墙,它是一种位于内部网络与外部网络之间的网络安全系统。一项信息安全的防护系统。按照给定的规则,允许或者限制网络报文通过 硬件防⽕墙:通过硬件和软件的组合,基于硬件的防⽕墙保护整个内部网络安全。&a…

如何使用Win10搭建我的世界Minecraft服务器

简单几步在windwos搭建我的世界服务器,并通过cpolar工具将本地服务暴露到公网连接 1. Java环境搭建 以windows10系统为例,配置java环境,搭建我的世界服务器,下载最新版java版本 Java Downloads | Oracle 选择exe文件,下载完成后双击安装包…

JVM程序计数器到底存储的是当前执行的指令地址,还是下一条指令的地址

JVM程序计数器到底存储的是当前执行的指令地址,还是下一条指令的地址? 说法一:chatgpt 程序计数器(Program Counter,PC)存储的是下一条指令的地址。在CPU执行指令时,程序计数器始终跟踪着当前已…

【机器人仿真Webots教程】-Webots安装

Webots安装 文章目录Webots安装1. Webots简介2. Webots安装2.1 系统要求2.2 验证显卡驱动2.3 安装3. Webots仿真3.1 world文件3.2 Controller文件3.3 Supervisor Controller4. 启动方式1. Webots简介 webots是一个开源3D移动机器人仿真框架。其为Cyberbotics公司旗下研发开源框…

Fastjson反序列化漏洞复现(实战案例)

本文转载于:https://blog.csdn.net/jinzezhi/article/details/124274123 漏洞介绍 FastJson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出…

【Python_Opencv图像处理框架】图像基本操作+90bb5729-b33a-4e82-a0d9-faa3e5cbf621

写在前面 很幸运能选择Python语言进行学习,这是有关Opencv的图像处理的第一篇文章,讲解了有关图像处理的一些基础操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正❤️ 写在中间 1…

unity物体运动经过特定点并绘出轨迹

经过线如果有圆滑可以参考 Unity物体运动时画出轨迹_天人合一peng的博客-CSDN博客 并修改里面的数值轨迹会有变化 float angle Mathf.Min(1, Vector3.Distance(this.transform.position, targetPos) / distanceToTarget) * 45; this.transform.rotation this.t…

App灰度发布实现路径之小程序容器

灰度从字面意思理解就是存在于黑与白之间的一个平滑过渡的区域,所以说对于互联网产品来说,上线和未上线就是黑与白之分,而实现未上线功能平稳过渡的一种方式就叫做灰度发布。 灰度发布将新版本应用程序推送给一部分用户进行测试和反馈的过程…

7、ThingsBoard使用docker compose集群部署

1、概述 今天我将讲解官方文档说的使用docker compose集群部署ThingsBoard,这种部署方式也是目前企业中常用的形式,希望大家能够掌握,我不是直接使用官方的镜像,我是自己拉起代码,然后自己构建镜像,在传到服务器上,使用自己的镜像来部署。而且这种部署中间有个大坑,我…

【大数据Hadoop】HDFS3.3.1-Namenode-缓存管理

缓存管理前言缓存概念HDFS 集中式缓存有两个主要概念。缓存管理命令HDFS 集中式缓存架构CacheManager 类实现CacheReplicationMonitor前言 Hadoop 2.3.0 版本新增了集中式缓存管理(Centralized Cache Management)功能,允许用户将一些文件和目…

数字滤波器设计——FIR 滤波器

数字滤波器设计实践介绍 此示例说明如何使用 Signal Processing Toolbox 产品中的 designfilt 函数,根据频率响应设定设计 FIR 和 IIR 滤波器。该示例重点讲述低通滤波器,但大多数结果也适用于其他响应类型。 此示例主要介绍数字滤波器的设计&#xff…

MATLAB | 如何用MATLAB如何绘制各式各样精致的三元相图(ternary plot)

整了个大活,写了一个能够生成非常精致三元相图的函数,这种图主要用于展示三种变量之间的比例,本期实验绘制效果如下: 编写不易,这个工具写的脑壳痛,求多多点赞,依旧先介绍咋使用,工具…

嵌入式软件架构

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录1 嵌入式软件分类 – BAREMETAL2 嵌入式软件分类 – 实时操作系统 (RTOS)3 嵌入式软件分类 – “通用”操作系统4 嵌入式软件分类 – 容器/微服务微服务容器5 嵌…

入行 4 年,跳槽 2 次,我摸透了软件测试这一行

最近几年行业在如火如荼的发展壮大,以及其他传统公司都需要大批量的软件测试人员,但是20年的疫情导致大规模裁员,让人觉得行业寒冬已来,软件测试人员的职业规划值得我们深度思考。 大家都比较看好软件测试行业,只是因为…

python入门(四)python眼里的图像

文章目录背景一.搭建jupyter环境Jupyter 是什么:安装Jupyter Lab1: cmd中找到 anaconda powershell prompt2.切换到python3.8环境中3. 安装Jupyter4. 运行jupyter-lab5. 备注6.命令练习二.图像的本质背景 本人工作中,用到了ai相关技术,但是java出身&…

CNStack 云服务云组件:打造丰富的云原生技术中台生态

作者:刘裕惺 CNStack 相关阅读: CNStack 多集群服务:基于OCM 打造完善的集群管理能力 CNStack 虚拟化服务:实现虚拟机和容器资源的共池管理 CNStack 云边协同平台:实现原生边缘竟能如此简单 01 前言 CNStack 2.0…

Linux网络IO精华指南

在互联网中提起网络,我们都会避免不了讨论高并发、百万连接。而此处的百万连接的实现,脱离不了网络 IO 的选择,因此本文作为一篇个人学习的笔记,特此进行记录一下整个网络 IO 的发展演变过程。以及目前广泛使用的网络模型。 1.网…

小说情感倾向分析工具

目前有很多中英文小说情感倾向工具,以下是一些常用的工具: 情感分析工具:可以对文本进行情感识别,根据文本中包含的情感信息,将其转化成情感值,通常有积极情感值、消极情感值、中性情感值等,常…

Vue3.0的生命周期

要说清这个生命周期钩子,首先我们要通过一个实例来讲解 就是点击这个按钮来切换Demo组件的显示隐藏,当然它也疯狂的操作Demo的挂载,卸载 红色是卸载流程,蓝色是挂载流程 我们写在外面可以实现,但是v3的思想是组合api因…

树状数组与线段树的应用

一、树状数组 树状数组给人的感觉就像,一直在维护前缀和一样,只是加快了前缀和的速度,再用前缀和结合题目得出一些性质,从而去解题。(一些不成熟的看法) 基础知识(一般树状数组用来处理单点修…