Node.js开发-会话控制

这篇具有很好参考价值的文章主要介绍了Node.js开发-会话控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1) 介绍

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

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

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

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

  • cookie

  • session

  • token

2) cookie

cookie 是什么

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

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

简单示例:

域名 cookie
www.baidu.com a=100; b=200
www.bilibili.com xid=1020abce121; hm=112411213
jd.com x=100; ocw=12414cce

cookie 的特点

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

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

cookie 的代码操作

express 中可以使用 cookie-parser 进行处理

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

const app = express();
app.use(cookieParser());

app.get("/set-cookie", (req, res) => {
    //res.cookie("name", "zhangsan"); // 会在浏览器关闭时销毁
    res.cookie("name", "lisi", {maxAge: 60 * 1000});
    res.cookie("theme", "blue");
    res.send("home");
});

app.get("/remove-cookie", (req, res) => {
    res.clearCookie("name");
    res.send("remove success");
});

// get cookie
app.get("/get-cookie", (req, res) => {
    console.log(req.cookies);
    res.send(`Welcome ${req.cookies.name}`);
});

app.listen(3000);

3) session

session 是什么

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

session 的作用

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

session 运行流程

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

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

session 的代码操作

express 中可以使用 express-session 对 session 进行操作

//导入express
const express = require("express");
//1. 安装包 npm i express-session connect-mongo
//2. 引入 express-session connect-mongo
const session = require("express-session");
const MongoStore = require('connect-mongo');
const e = require("express");

const app = express();

//3. 设置 session 的中间件
app.use(session({
    name: 'sid', //设置cookie的name,默认值是:connect.sid
    secret: 'atguigu', //参与加密的字符串(又称签名)加盐
    saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的id
    resave: true, //是否在每次请求时重新保存session
    store: MongoStore.create({
        mongoUrl: 'mongodb://127.0.0.1:27017/bilibili' //数据库的连接配置
    }),
    cookie: {
        httpOnly: true, // 开启后前端无法通过 JS 操作
        maxAge: 1000 * 60 * 5 // 这一条 是控制 sessionID 的过期时间的!!!
    },
}))

app.get("/", (req, res) => {
    res.send("home");
});

// 设置 session
app.get("/login", (req, res) => {
    // username=admin&password=admin
    if(req.query.username === 'admin' && req.query.password === 'admin'){ 
        // 设置 session
        req.session.username = 'admin';
        req.session.sid = '1234rtgfds';
        res.send("登录成功");
    }
});

// session读取
app.get("/cart", (req, res) => {
    // 检测session
    if (req.session.username){
        res.send(`Welcome ${req.session.username}`);
    } else {
        res.send("请先登录");
    }
});

// session销毁
app.get("/logout", (req, res) => {
    req.session.destroy(() => {
        res.send("退出成功");
    });
});

app.listen(3000);

4) session 和 cookie 的区别

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

1.存在的位置

  • cookie:浏览器端
  • session:服务端

2.安全性

  • cookie 是以明文的方式存放在客户端的,安全性相对较低
  • session 存放于服务器中,所以安全性 相对 较好

3.网络传输量

  • cookie 设置内容过多会增大报文体积, 会影响传输效率
  • session 数据存储在服务器,只是通过 cookie 传递 id,所以不影响传输效率

4.存储限制

  • 浏览器限制单个 cookie 保存的数据不能超过 4K ,且单个域名下的存储数量也有限制
  • session 数据存储在服务器中,所以没有这些限制

5) token

token 是什么

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

token 的作用

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

token 的工作流程

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

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

token 的特点

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

JWT

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

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

可以使用 jsonwebtoken 包 来操作 token文章来源地址https://www.toymoban.com/news/detail-829477.html

const jwt = require('jsonwebtoken');

// 生成/创建 token
// let token = jwt.sign(用户数据,加密字符串, 配置对象);
let token = jwt.sign({
    username: 'zhangsan',
}, 'atguigu', {
    expiresIn: 60 // 单位是秒
});

console.log(token);

// 校验 token
let t = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InpoYW5nc2FuIiwiaWF0IjoxNzA3NzMxMDgyLCJleHAiOjE3MDc3MzExNDJ9.gyRxrxatBBL89twd5FYfrfNKYQ98d00NuwnnnF2_iNg";
jwt.verify(t, 'atguigu', (err, data) => {
    if (err) {
        console.log('token 验证失败');
        return;
    }
    console.log('token 验证成功');
    console.log(data);
});

到了这里,关于Node.js开发-会话控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Node.js开发-MongoDB

    介绍 Mongoose 是一个对象文档模型库,官网 http://www.mongoosejs.net/ 作用 方便使用代码操作 mongodb 数据库 使用流程 文档结构可选的常用字段类型列表 类型 描述 String 字符串 Number 数字 Boolean 布尔值 Array 数组,也可以使用 [] 来标识 Date 日期 Buffer Buffer 对象 Mixed 任意类型,需要使

    2024年02月20日
    浏览(46)
  • Node 调试利器,前端、Node 开发必备 - VSCode JS Debug Terminal

    经常看到有同学抱怨 Node 调试麻烦或者是搞不清怎么调试各种脚本、 Jest 、 Webpack 等等,而偶尔看到的调试相关的文章又全都是在写 inspect 、 launch.json 这些方案,其实有一定学习成本。 而其实在 VSCode 中早已内置了相当无脑的 Debug 方式,就是 JavaScript Debug Terminal ,利用它我

    2024年02月05日
    浏览(56)
  • 【Nodejs】Node.js开发环境安装

    在命令窗口中输入 node -v 可以查看版本 0.x 完全不技术 ES6 4.x 部分支持 ES6 特性 5.x 部分支持ES6特性(比4.x多些),属于过渡产品,现在来说应该没有什么理由去用这个了 6.x 支持98%的 ES6 特性 8.x 支持 ES6 特性 去 Node.js 的官网下载安装包: 我们也可以下载历史版本。 后续如果

    2024年02月15日
    浏览(76)
  • 安装配置nvm-windows对Node.js与npm进行版本控制

    由于Node.js版本原因,可能会出现一些错误,如 IDEA中Node.js环境下npm报错Error:0308010C:digital envelope routines:unsupported 。而且不同的项目,所采用的Node.js的版本不同,重新卸载安装配置,太过繁琐。 所以可以使用nvm来动态灵活管理Node.js的版本 。 注意:Win7系统不支持最新版本Nod

    2024年02月10日
    浏览(85)
  • 06_Node.js服务器开发

    1.1 为什么学习服务器开发 Node.js开发属于服务器开发,那么作为一名前端工程师为什么需要学习服务器开发呢? 为什么学习服务器开发? 能够和后端程序员更加紧密配合 网站业务逻辑前置 扩宽知识视野 1.2 服务器开发可以做哪些事情 实现网站的业务逻辑 实现数据的增删改

    2024年02月07日
    浏览(51)
  • Node.js博客项目开发思路笔记

    开发一个博客系统,具备博客基本功能 只开发 server 端,不关心前端 首页、作者页、博客详情页 登陆页 管理中心、新建页、编辑页 数据如何存储 博客 id title content createtime author 1 标题 1 内容 1 1111112 zhangsan 2 标题 2 内容 2 1111111 lisi 用户 id username password realname 1 zhangsan 123 张三

    2024年02月12日
    浏览(44)
  • Node.js Shell 脚本开发指南(下)

    原文: exploringjs.com/nodejs-shell-scripting/ch_creating-shell-scripts.html 译者:飞龙 协议:CC BY-NC-SA 4.0 14.1 所需的知识 14.1.1 本章的下一步是什么 14.2 Node.js ESM 模块作为 Unix 上独立的 shell 脚本 14.2.1 Unix 上的 Node.js shell 脚本 14.2.2 Unix 上的 Hashbangs 14.2.3 在 Unix 上使文件可执行 14.2.4 直接运行

    2024年01月23日
    浏览(49)
  • Node.js Shell 脚本开发指南(中)

    原文: exploringjs.com/nodejs-shell-scripting/ch_nodejs-streams.html 译者:飞龙 协议:CC BY-NC-SA 4.0 9.1 总结:异步迭代和异步生成器 9.2 流 9.2.1 管道 9.2.2 文本编码 9.2.3 辅助函数: readableToString() 9.2.4 一些初步说明 9.3 可读流 9.3.1 创建可读流 9.3.2 通过 for-await-of 从可读流中读取

    2024年01月24日
    浏览(64)
  • 第六章认识Node.js服务器开发

    目录 Node.js同步和异步编程 基本概念 执行方式 获取异步API的返回值 网页基础扩展 项目 Node.js同步和异步编程 基本概念 同步API(应用程序编程接口)是指只有当前API执行完毕后才能继续执行下一个API。 形象的说同步模式就是一个服务员在某一个时间段内只服务一个客人的模

    2024年02月05日
    浏览(55)
  • 华纳云:linux怎么搭建node.js开发环境

    搭建Node.js开发环境在Linux系统上非常简单,以下是一些基本步骤,以帮助您开始: 1. 安装Node.js: 您可以通过包管理器来安装Node.js。不同的Linux发行版使用不同的包管理器。以下是一些常见的Linux发行版和它们的包管理器: Ubuntu/Debian: 使用apt包管理器。 sudo apt update sudo apt

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包