【Node.js】会话控制

express 中操作 cookie

cookie 是保存在浏览器端的一小块数据。

cookie 是按照域名划分保存的。

浏览器向服务器发送请求时,会自动将
当前域名下可用的 cookie 设置在请求头中,然后传递给服务器。

这个请求头的名字也叫 cookie ,所以将 cookie 理解为一个 HTTP 的请求头也是可以的。

在这里插入图片描述

在这里插入图片描述

const express = require('express');
//1. 安装 cookie-parser  npm i cookie-parser
//2. 引入 cookieParser 包
const cookieParser = require('cookie-parser');
const app = express();
//3. 设置 cookieParser 中间件
app.use(cookieParser());
//4-1 设置 cookie 
app.get('/set-cookie', (request, response) => {// 不带时效性response.cookie('username', 'wangwu');// 带时效性response.cookie('email', '23123456@qq.com', { maxAge: 5 * 60 * 1000 });//响应response.send('Cookie的设置');
});
//4-2 读取 cookie
app.get('/get-cookie', (request, response) => {//读取 cookieconsole.log(request.cookies);//响应体response.send('Cookie的读取');
});
服务器
//4-3 删除cookie
app.get('/delete-cookie', (request, response) => {//删除response.clearCookie('username');//响应response.send('cookie 的清除');
});
//4. 启动服务
app.listen(3000, () => {console.log('服务已经启动....');
});

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

express 中操作 session

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

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

在这里插入图片描述

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

在这里插入图片描述

const express = require("express");
//1. 安装包   npm i express-session  connect-mongo
//2. 引入 express-session  connect-mongo
const session = require("express-session"); // 默认将 session 存入了内存中
const MongoStore = require("connect-mongo"); // 操作数据库的中间件 这样可以直接将 sessions 存入数据库 便于显示
const app = express();
//3. 设置 session 的中间件
app.use(session({name: "sid", //设置cookie的name,默认值是:connect.sidsecret: "heo", //参与加密的字符串(又称签名)saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的idresave: true, //是否在每次请求时重新保存session 更新过期时间store: MongoStore.create({mongoUrl: "mongodb://127.0.0.1:27017/bilibili", //数据库的连接配置}),// 设置了session默认保存在内存 这里我保存在了数据库// 但是返回的形式是 set-cookiecookie: {httpOnly: true, // 开启后前端无法通过 JS 操作maxAge: 1000 * 300, // 这一条 是控制 sessionID 和 其对应的 cookie 的过期时间的!!!},})
);
//创建 session
app.get("/login", (req, res) => {//设置sessionreq.session.username = "admin";req.session.password = "admin";res.send("登录成功");
});
//获取 session
app.get("/home", (req, res) => {console.log("session的信息");console.log(req.session.username);if (req.session.username) {res.send(`你好 ${req.session.username}`);} else {res.send("登录  注册");}
});
//销毁 session
app.get("/logout", (req, res) => {//销毁session// res.send('设置session');req.session.destroy(() => {res.send("成功退出");});
});
app.listen(3000, () => {console.log("服务已经启动, 端口 " + 3000 + " 监听中...");
});

在这里插入图片描述

在这里插入图片描述

cookie 和 session 的区别

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

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

这里需要注意:session 是存储在服务器的一种会话机制。浏览器的绘画存储是 sessionStorage 也是HTML5新增的特性,也是用来本地存储数据的,sessionStorage存储的数据只有在同一个会话中才能被访问,关闭浏览器数据就会被清除。sessionStorage存储的数据是不能跨进程的,也就是在同一个浏览器的不同tab页中,sessionStorage不是共享的。sessionStorage数据存储在浏览器内存中,因此关闭浏览器数据就会被清除。所以 session 和 sessionStorage 没有关系。

token

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

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

在这里插入图片描述

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

在这里插入图片描述

token 的特点:

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

JWT

JWT(JSON Web Token )是目前最流行的跨域认证解决方案,可用于基于 token 的身份验证 JWT 使 token 的生成与校验更规范。

//导入 jsonwebtokan
const jwt = require("jsonwebtoken");
//创建 token
// jwt.sign(数据, 加密字符串, 配置对象)
let token = jwt.sign({username: "zhangsan",},"heo",{expiresIn: 60, //单位是 秒}
);
//解析 token
jwt.verify(token, "atguigu", (err, data) => {if (err) {console.log("校验失败~~");return;}console.log(data);
});

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

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

相关文章

PHP场地预约共享茶室棋牌室小程序系统源码

🍵🎲【聚会新宠】场地预约神器,共享茶室棋牌室小程序大揭秘!🎉 🏡【开篇:告别繁琐,聚会新选择】🏡 还在为找不到合适的聚会场地而烦恼吗?想要一个既私密又舒…

LLaMA 背景

什么是LLaMA? 模型介绍:LLaMA是Meta开发的语言模型,旨在推动开放科学和人工智能的实践。 参数范围:这些模型的参数数量从7B到65B不等,覆盖了不同规模的需求。 训练数据:LLaMA模型是在数万亿个公开数据集的…

全国媒体邀约,主流媒体到场出席采访报道

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 全国媒体邀约,确保主流媒体到场出席采访报道,可以带来一系列的好处,这些好处不仅能够增强活动的可见度,还能对品牌或组织的长期形象产生积…

elementUI在手机端使用遇到的问题总结

之前的博客有写过用vue2elementUI封装手机端选择器picker组件,支持单选、多选、远程搜索多选,最终真机调试的时候发现有很多细节样式需要调整。此篇博客记录下我调试过程中遇到的问题和解决方法。 一、手机真机怎么连电脑本地代码调试? 1.确…

pycharm如何debug for循环里面的错误值

一般debug时,在for循环里面的话,需要自己一步一步点。如果循环几百次那种就比较麻烦。此时可以采用try except的方式来解决 例子如下 #ptyhon debug for循环的代码 num[1,2,3,s,4] ans0 for i in num:try:ansiexcept:print(错误) print(ans) 结果如下&a…

<数据集>木材缺陷检测数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:4000张 标注数量(xml文件个数):4000 标注数量(txt文件个数):4000 标注类别数:8 标注类别名称:[Quartzity,Live_Knot,Marrow,resin,Dead_Knot,knot_with_crack,Knot_m…

[论文笔记] CT数据配比方法论——1、Motivation

我正在写这方面的论文,感兴趣的可以和我一起讨论!!!!!! Motivation 1、探测原有模型的配比: 配比 与 ppl, loss, bpw, benchmark等指标 之间的关系。 2、效果稳定的配比:配比 与 模型效果 之间的规律。 Experiments 1、主语言(什么语言作为主语言,几种主语言?…

Leetcode1929. 数组串联

问题描述&#xff1a; 给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans &#xff0c;数组下标 从 0 开始计数 &#xff0c;对于所有 0 < i < n 的 i &#xff0c;满足下述所有要求&#xff1a; ans[i] nums[i]ans[i n] nums[i] 具体而言…

leetcode101. 对称二叉树,递归法+迭代法详解附代码

leetcode101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 递归法…

Python算法实现之排序算法的Python实现详解

概要 排序算法是计算机科学中最基础和最重要的算法之一。它们在数据处理中起着关键作用,广泛应用于搜索、数据分析和优化等领域。本文将详细介绍几种常见的排序算法及其Python实现,包括冒泡排序、选择排序、插入排序、归并排序和快速排序,并通过具体示例代码展示它们的工作…

qml 实现一个listview

主要通过qml实现listvie功能&#xff0c;主要包括右键菜单&#xff0c;滚动条&#xff0c;拖动改变内容等&#xff0c;c 与 qml之间的变量和函数的调用。 main.cpp #include <QQuickItem> #include <QQmlContext> #include "testlistmodel.h" int main…

19-2 LLM之野望 2 - LLM给到Quora面临的困境

Quora 有一个简单的前提&#xff1a;它是一个分享知识和专业知识的地方&#xff0c;好奇的人可以就任何可以想象到的话题提出问题&#xff0c;并从平台博学的社区获得深思熟虑的、见识广博的答案。 想想雅虎答案 (Yahoo Answers)&#xff0c;它适用于技术员工和格拉德威尔式的…

C#语法基础详解(万字总结)

文章目录 **参考书籍&#xff1a;C#7.0 核心技术指南**类型类字段解构器对象初始化器属性表达式属性(只读属性才可以)自动属性属性初始化器 索引器静态构造器nameof运算符 继承类型转换和引用转换as运算符is运算符is与模式变量 虚函数成员抽象类和抽象成员new和重写base关键字构…

1. 个人谈心 ——【如何学习编程及合理安排休息时间】

&#x1f4d6; 声明 ! ! ! 此文章仅仅属于个人思想&#xff0c;如有不满或者意见不相同&#xff0c;可以在评论区讨论留言&#xff0c;非常感谢支持&#xff01;&#xff01;&#xff01; &#x1f495;个人主页&#xff1a;三亿老奶奶心中的梦 &#x1f4d8;收录专栏&#xff…

【贪心算法】力扣1481.不同整数的最少数目

给你一个整数数组 arr 和一个整数 k 。现需要从数组中恰好移除 k 个元素&#xff0c;请找出移除后数组中不同整数的最少数目。 示例 1&#xff1a; 输入&#xff1a;arr [5,5,4], k 1 输出&#xff1a;1 解释&#xff1a;移除 1 个 4 &#xff0c;数组中只剩下 5 一种整数。…

docker默认存储地址 var/lib/docker 满了,换个存储地址操作流程

1. 查看docker 存储地址 docker info如下 var/lib/docker2、查看内存大小 按需执行 df -h 找超过100M的大文件 find / -type f -size 100M -exec ls -lh {} \; df -Th /var/lib/docker 查找这个文件的容量 df -h 查找所有挂载点 du -hs /home/syy_temp/*1、df -h 2、sud…

IDEA关联数据库

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试&#xff08;Debug&#xff09; 第七章 …

移动设备安全革命:应对威胁与解决方案

移动设备已成为我们日常工作和家庭生活中不可或缺的工具&#xff0c;然而&#xff0c;对于它们安全性的关注和投资仍然远远不够。本文深入分析了移动设备安全的发展轨迹、目前面临的威胁态势&#xff0c;以及业界对于这些安全漏洞响应迟缓的深层原因。文中还探讨了人们在心理层…

自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍

文章目录 1. 背景介绍2. 功能定义3. 功能原理4. 传感器架构5. 实际应用案例5.1 典型场景1&#xff1a;前方车辆压线5.2 典型场景2&#xff1a;相邻车道有大型车辆5.3 典型场景3&#xff1a;它车近距离cut in 6. 总结与展望 1. 背景介绍 随着汽车技术的发展&#xff0c;智能巡航…

AWS基础知识

VPC (Virtual Private Cloud): 参考&#xff1a;https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html With Amazon Virtual Private Cloud (Amazon VPC), you can launch AWS resources in a logically isolated virtual network that you’ve defined…