node.js实现分页,jwt鉴权机制,token,cookie和session的区别

文章目录

  • 1. 分⻚功能
  • 2. jwt鉴权机制
    • 1.jwt是什么
    • 2.jwt的应用
    • 3.优缺点
  • 3. cookie,token,session的对比


1. 分⻚功能

  1. 为什么要分页
    • 如果数据量很⼤,⽐如⼏万条数据,放在⼀个⻚⾯显⽰的话显然不友好,这时候就需要采⽤分⻚显⽰的形式。
    • 如每次只显⽰10条数据要实现分⻚功能,实际上就是从结果集中显⽰第1(10条记录作为第1⻚,显⽰第11)20条记录作为第2⻚,以此类推。
    • 分⻚实际上就是从结果集中截取出第M~N条记录
  2. 实现
    • 前端实现分⻚功能,需要后端返回必要的数据,如总的⻚数,总的数据量,当前⻚,当前的数据
    • 后端的处理逻辑
    1. 获取⽤⼾参数⻚码数page和每⻚显⽰的数⽬pageSize,其中page是必须传递的参数,pageSize为可选参数,默认为10
    2. 编写SQL语句,利⽤limit和offset关键字进⾏分⻚查询
    3. 查询数据库,返回总数据量、总⻚数、当前⻚、当前⻚数据给前端
    var mysql      = require('mysql');
    var connection = mysql.createConnection({host     : 'localhost',user     : 'root',password : '1q2w3e4r',database : 'test'
    });
    connection.connect();
    let param = {pageSize: 20,pageNo: 1
    }
    let pageSize = param.pageSize || 10;
    let start = (param.pageNo - 1) * pageSize;   // 每⼀条数据的起始位置start
    let sql = `select * from students order by score desc limit ${pageSize} OFFSET ${start}`
    connection.query(sql, function (error, results, fields) {if (error) throw error;console.log(results);
    });
    connection.end();
    
    在这里插入图片描述
    ⾸先确定每⻚显⽰的数量pageSize,当前⻚的索引pageIndex (从1开始),确定LIMIT 和OFFSET 应该设定的值:
    • LIMIT 总是设定为pageSize
    • OFFSET计算公式为pageSize*(pageIndex-1)
      确定了这两个值,就能查询出第N⻚的数

2. jwt鉴权机制

1.jwt是什么

JWT(JSONWebToken),本质就是⼀个字符串书写规范,作⽤是⽤来在⽤⼾和服务器之间传递安全可靠的信息。

  • JSON Web Tokens 的组成
    在其紧凑的格式中,JSON Web Tokens 由三部分组成,由点 (.)分隔,它们是:Header(标头)Payload(有效载荷 ) Signature(签名)
    1. Header
      标头通常由两部分组成:令牌的类型,即 JWT,以及所使用的签名算法,例如 HMAC SHA256 或 RSA.
      有效示例{ "alg": "HS256", "typ": "JWT" }
    2. Payload
      令牌的第二部分是有效负载,其中包含声明。声明是关于实体(通常是用户)和附加数据的声明。声明分为三种类型:registered(注册声明)、public(公共声明)和private(私人声明).
      • 已注册声明: 这些是一组预定义的声明,它们不是强制性的,但建议使用,以提供一组有用的、可互操作的声明。其中一些是:
        iss(发布者)、
        exp(到期时间)、
        sub(主题)、
        aud(受众)
        nbf: 定义在什么时间之前,该jwt都是不可用的.
        iat: jwt的签发时间
        jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。.
      • 公共声明: 这些可以由使用 JWT 的人随意定义。但是为了避免冲突,它们应该在IANA JSON Web Token注册表中定义,或者定义为包含抗冲突名称空间的 URI。
      • 私人声明: 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公共声明
        有效载荷示例 { "sub": "1234567890", "name": "John Doe", "admin": true }
    3. Signature
      要创建签名部分,您必须采用编码标头、编码有效负载、秘码、标头中指定的算法,然后对其进行签名.

2.jwt的应用

  1. 安装指令
    npm install jsonwebtoken
    
  2. 加密
    jwt.sign(payload, secretOrPrivateKey, [options, callback]
    参数解析
    1. payload:可以是表示有效 JSON 的对象文本、缓冲区或字符串

    2. secretOrPrivateKey:是一个字符串(utf-8 编码)、缓冲区、对象或 KeyObject,其中包含 HMAC 算法或 PEM 的密钥 RSA 和 ECDSA 的编码私钥

    3. options:

      • algorithm(默认:HS256)
      • expiresIn:以秒为单位或描述时间跨度 Vercel/ms 的字符串 (60, “2 days”, “10h”, “7d”)。
      • notBefore:以秒为单位或描述时间跨度 Vercel/ms 的字符串。
      • mutatePayload:如果为 true,则 sign 函数将直接修改 payload 对象。如果您在将声明应用于有效负载之后但在将其编码为令牌之前需要对有效负载的原始引用,这将非常有用。
      • allowInsecureKeySizes:如果为 true,则允许将模数低于 2048 的私钥用于 RSA
      • allowInvalidAsymmetricKeyTypes:如果为 true,则允许与指定算法不匹配的非对称键。此选项仅用于向后兼容,应避免使用。
      	var jwt = require('jsonwebtoken');const secret = 'xixi' // 私钥var token = jwt.sign({ name: '西西' }, secret);console.log(token, '1111')var token1 = jwt.sign({ name: '西西' }, secret, { algorithm: 'HS512' });console.log(token1, '2222')// 异步jwt.sign({ name: '西西' }, secret, { algorithm: 'HS512' }, function(err, token) {console.log(token, '3333');});var older_token = jwt.sign({ name: '西西', iat: Math.floor(Date.now() / 1000) - 30 }, secret);console.log(older_token, '4444');
      

      在这里插入图片描述
      加密时效性

      	var jwt = require('jsonwebtoken');const secret = 'xixi' // 私钥let token = jwt.sign({exp: Math.floor(Date.now() / 1000) + (60 * 60),name: '西西'}, secret);console.log(token, '1111')let token1 = jwt.sign({name: '西西'}, secret, { expiresIn: 60 * 60 });console.log(token1, '2222')let tokenh = jwt.sign({name: '西西'}, secret, { expiresIn: '1h' });console.log(tokenh, '3333')
      

      在这里插入图片描述

  3. 解密
    jwt.verify(token, secretOrPublicKey, [options, callback])
    
    参数解析
    1. token是 JsonWebToken 字符串
    2. secretOrPublicKey是一个字符串(utf-8 编码)、缓冲区或 KeyObject,其中包含 HMAC 算法的密钥或 PEM RSA 和 ECDSA 的编码公钥。
    3. options
      • algorithms:包含允许算法名称的字符串列表。例如。[“HS256”, “HS384”]
      • audience:如果要检查 audience (),请在此处提供一个值。可以根据字符串、正则表达式或字符串和/或正则表达式列表检查受众。
      • complete:返回具有 decoded 的对象,而不仅仅是有效负载的通常内容。{ payload, header, signature }
      • issuer(可选):字段有效值的字符串或字符串数组。iss
      • jwtid(可选):如果要检查 JWT ID (),请在此处提供字符串值。jti
      • ignoreExpiration:如果不验证令牌的过期时间。true
      • ignoreNotBefore…
      • subject:如果要检查主题 (),请在此处提供一个值sub
      • clockTolerance:检查 and 声明时可容忍的秒数,以处理不同服务器之间的小时钟差异nbfexp
      • maxAge:令牌仍然有效的最大允许年龄。它以秒或描述时间跨度 vercel/ms 的字符串表示。
      • clockTimestamp:应用作所有必要比较的当前时间(以秒为单位)。
      • nonce:如果要检查 Claim,请在此处提供 String 值。它用于 ID 令牌的 Open ID。(Open ID 实施说明nonce)
      • allowInvalidAsymmetricKeyTypes:如果为 true,则允许与指定算法不匹配的非对称键。此选项仅用于向后兼容,应避免使用。
    let token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoi6KW_6KW_IiwiaWF0IjoxNzMzMjEwMTc5fQ.24KOMgCK2W6DTUvcotDlP2ciKL_EmA9tTdGJLMZByfc'
    var decoded = jwt.verify(token, secret);
    console.log(decoded) // bar
    let token1 = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoi6KW_6KW_IiwiaWF0IjoxNzMzMjEyMDQ4LCJleHAiOjE3MzMyMTU2NDh9.3gDiIfvDNWbn1DR5a0pZtr0Cwkv_aueHZgui8HVluRo'
    var decoded1 = jwt.verify(token1, secret);
    console.log(decoded1)
    
    在这里插入图片描述
  4. 校验
    使⽤koa-jwt 中间件进⾏验证,⽅式⽐较简单
    • 安装指令
      npm install koa-jwt
      
    • 安装指令
      app.use(koajwt({secret: 'test_token'
      }).unless({ // 配置白名单path: [/\/api\/register/, /\/api\/login/]
      
    • 案例
      // 服务代码
      const Koa = require('koa')
      const app = new Koa()
      var jwt = require('jsonwebtoken');
      const Router = require('koa-router')
      var router = new Router(); // 总路由
      const koajwt = require('koa-jwt');
      const cors = require('koa2-cors')
      const secret = 'xixi' // 私钥
      // 解决跨域
      app.use(cors({origin: function(ctx) {// 这里可以根据实际需求设置允许跨域的域名,或者使用函数进行复杂配置// if (ctx.url === '/crossdomain') {//   return 'http://example.com';// }return '*'; // 允许所有域},maxAge: 5, // 表示在5秒内不需要再发送预检请求credentials: true, // 允许cookiesallowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
      }))
      // 可以通过unless配置接⼝⽩名单,也就是哪些URL可以不⽤经过校验,像登陆/注册都可以不⽤校验
      //  校验的中间件需要放在需要校验的路由前⾯,⽆法对前⾯的URL进⾏校验
      app.use(koajwt({secret}))router.post('/api/login_post_json', async (ctx) => {console.log(ctx.request)console.log('abcd');ctx.body = "abcd页";
      })app.use(router.routes()).use(router.allowedMethods());
      app.listen(8081, function() {console.log('服务启动!端口号:8081')
      });
      
      // html 代码
      <!DOCTYPE html>
      <html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><script src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js"></script></head><body><button id="btnPOST">POST</button><script>$(function () {// 2. 测试POST接口let token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoi6KW_6KW_IiwiaWF0IjoxNzMzMjg5ODE3fQ.rlwgJqUEFXO4_K7FijNELqkOLnOBgGzx1GCn7QY4rXU'$('#btnPOST').on('click', function () {$.ajax({type: 'POST',url: 'http://127.0.0.1:8081/api/login_post_json',headers: {'Content-Type': 'application/json;charset=utf-8', Authorization: `Bearer ${token}`  }, // 注:需要在请求头中使用Authorization字段并使用Bearer模式来发送token,data: { name: '西西', author: '11111'},success: function (res) {console.log(res)},})})})</script></body>
      </html>
      

3.优缺点

优点:

  • json具有通⽤性,所以可以跨语⾔
  • 组成简单,字节占⽤⼩,便于传输
  • 服务端⽆需保存会话信息,很容易进⾏⽔平扩展
  • ⼀处⽣成,多处使⽤,可以在分布式系统中,解决单点登录问题
  • 可防护CSRF攻击

缺点:

  • payload部分仅仅是进⾏简单编码,所以只能⽤于存储逻辑必需的⾮敏感信息
  • 需要保护好加密密钥,⼀旦泄露后果不堪设想
  • 为避免token被劫持,最好使⽤https协议

3. cookie,token,session的对比

‌Cookie、Token和Session是Web开发中常用的三种用户会话管理机制

  • Cookie
    Cookie 是一种由服务器发送到客户端浏览器的小数据片段,用于存储用户的状态信息。
    它主要用于跟踪用户会话、存储用户偏好设置、记住用户登录状态等。
    优点

    1. 存储在客户端,服务器负担较轻‌。
    2. ‌每次请求时自动发送‌,适合无状态应用。

    缺点

    1. 容量有限‌,单个Cookie的大小通常不超过4KB。
    2. 安全性较低‌,容易被篡改或遭受跨站请求伪造(CSRF)攻击‌
  • Token
    Token是服务端生成的一串字符串,用作客户端进行请求的令牌‌。当用户第一次登录后,服务器生成一个Token并将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
    优点

    1. 无状态‌,适合无状态和分布式系统。
    2. 安全性较高‌,因为Token通常经过加密处理。

    缺点

    1. 每次请求都需要验证Token‌,可能会增加服务器的计算负担‌
  • Session
    ‌Session是在服务器端存储用户会话信息的机制‌。当用户访问网站时,服务器会为该用户创建一个唯一的Session,并生成一个Session ID。这个Session ID用于在多个请求之间保持用户的会话状态。
    优点

    1. 存储在服务器端,安全性较高‌,因为数据不存储在客户端。
    2. 可以存储大量数据‌,没有容量限制。

    缺点

    1. 占用服务器资源‌,可能影响性能‌
特性CookieSessionToken
存储位置客户端存储服务器端存储,客户端存储 Session ID客户端存储
安全性易受 CSRF 攻击,易被篡改更安全,敏感数据存储在服务器端一旦泄露可能被盗用
容量4KB 限制服务器端可以存储更多数据受限于 Token 大小,但一般较小
性能自动随请求发送服务器需要维护状态,增加负担无状态机制,适合分布式应用
使用场景适合简单的用户状态管理适合需要存储大量用户数据的应用适合需要无状态认证和分布式系统的应用

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

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

相关文章

ED6H系列FPGA口袋实验室

一、产品概述 ED6H系列FPGA口袋实验室是中科亿海微自主研发的基于“FPGA在线教学平台”的教学实践工具&#xff0c;专为高校电子相关专业师生打造&#xff0c;旨在为高校师生创造更具创新性与高效性的教学场景。具有高集成度、小巧便携、可扩展设计及自主可控等特点。本系列共…

实验三:Mybatis-动态 SQL

目录&#xff1a; 一 、实验目的&#xff1a; 通过 mybatis 提供的各种标签方法实现动态拼接 sql 二 、预习要求&#xff1a; 预习 if、choose、 when、where 等标签的用法 三、实验内容&#xff1a; 根据性别和名字查询用户使用 if 标签改造 UserMapper.xml使用 where 标签进行…

Python爬虫——猫眼电影

用python中requests库爬取猫眼电影信息并保存到csv文件中 猫眼专业版 爬取界面 效果预览 代码 import requests import jsonurl1https://piaofang.maoyan.com/dashboard-ajax?orderType0&uuid1938bd58ddac8-02c2bbe3b009ed-4c657b58-144000-1938bd58ddac8&timeStamp…

python 三钱筮法项目开发

三钱筮法项目技术说明 1. 技术栈 GUI框架: CustomTkinter 现代化的Tkinter扩展提供美观的界面组件支持主题定制 数据存储: JSON 卦象数据: gua_info.json记忆数据: memory.json易经解释: detail.json 图像处理: PIL (Python Imaging Library) 处理图标和图片资源 2. 主要功…

yagmail邮件发送库:如何用Python实现自动化邮件营销?

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

无人机的计算机仿真模拟控制

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月3日10点24分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅h…

vue+mars3d给影像底图叠加炫酷效果

话不多说&#xff0c;直接上效果图&#xff1a; 在这里墙体其实是有一个不太明显的流动效果 实现方式&#xff1a;这里我使用了PolylineEntityWallPrimitive&#xff0c;开始我用的是polygonEntity但是发现实现效果并不好&#xff0c;所有直接改用了线 map.vue文件&#xff1…

浅谈volatile

volatile有三个特性&#xff1a; &#xff08;1&#xff09;可见性 &#xff08;2&#xff09;不保证原子性 &#xff08;3&#xff09;禁止指令重排 下面我们一一介绍 &#xff08;一&#xff09;可见性 volatile的可见性是说共享变量只要修改&#xff0c;就可以被其他线…

Redis自学之路—高级特性(实现消息队列)(七)

目录 简介 Redis的Key和Value的数据结构组织 全局哈希表 渐进式rehash 发布和订阅 操作命令 publish 发布消息 subscribe 订阅消息 psubscribe订阅频道 unsubscribe 取消订阅一个或多个频道 punsubscribe 取消订阅一个或多个模式 查询订阅情况-查看活跃的频道 查询…

Java-09 深入浅出 MyBatis - 注解开发 注解映射 基本介绍 与 一对一模型

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

【k8s】kubelet 的相关证书

在 Kubernetes 集群中&#xff0c;kubelet 使用的证书通常存放在节点上的特定目录。这些证书用于 kubelet 与 API 服务器之间的安全通信。具体的位置可能会根据你的 Kubernetes 安装方式和配置有所不同&#xff0c;下图是我自己环境【通过 kubeadm 安装的集群】中的kubelet的证…

3.建立本地仓库及常用命令

1.建立本地仓库 要使用Git对我们的代码进行版本控制&#xff0c;首先需要获得本地仓库 1&#xff09;在电脑的任意位置创建一个空目录&#xff0c;作为我们的本地Git仓库 2&#xff09;进入这个目录&#xff0c;右键点击Git Bash 窗口 3&#xff09;执行命令git init 4) 如果创…

Narya.ai正在寻找iOS工程师!#Mixlab内推

如果你对AI技术和iOS开发充满热情&#xff0c;这里有一个绝佳的机会加入一家专注于AI应用创新的初创公司。Narya.ai正在招聘iOS工程师&#xff0c;帮助他们开发下一代效率工具&#xff0c;旨在提升用户的日常生活效率与幸福感。 关于Narya.ai&#xff1a; 专注于AI应用层创新&a…

AI开发:生成式对抗网络入门 模型训练和图像生成 -Python 机器学习

阶段1&#xff1a;GAN是个啥&#xff1f; 生成式对抗网络&#xff08;Generative Adversarial Networks, GAN&#xff09;&#xff0c;名字听着就有点“对抗”的意思&#xff0c;没错&#xff01;它其实是两个神经网络互相斗智斗勇的游戏&#xff1a; 生成器&#xff08;Gene…

039集——渐变色之:CAD中画彩虹()(CAD—C#二次开发入门)

&#xff08;来左边儿 跟我一起画个龙&#xff0c;在你右边儿 画一道彩虹 ~~~~~~~~~~~ &#xff09; 效果如下&#xff1a; 以下展示部分颜色源码&#xff1a; namespace AcTools {public class Class1{public Wform.Timer timer;//定时器需建在类下面public s…

C++知识整理day3类与对象(下)——赋值运算符重载、取地址重载、列表初始化、友元、匿名对象、static

文章目录 1.赋值运算符重载1.1 运算符重载1.2 赋值运算符重载 2.取地址重载2.1 const成员函数2.2 取地址运算符重载 3.类与对象的补充3.1 再探构造函数---初始化列表3.2 类型转换3.3 static成员3.4 友元3.5 内部类3.6 匿名对象3.7 对象拷贝时的编译器优化 1.赋值运算符重载 赋…

web vue 滑动选择 n宫格选中 九宫格选中

页面动态布局经常性要交给客户来操作&#xff0c;他们按时他们的习惯在同一个屏幕内显示若干个子视图&#xff0c;尤其是在医学影像领域对于影像的同屏显示目视对比显的更为重要。 来看看如下的用户体验&#xff1a; 设计为最多支持5行6列页面展示后&#xff0c;右侧的布局则动…

解决idea使用maven打包时无法将本地lib库文件和resource目录中的资源文件打包进jar文件的问题!!!

一、问题复现 1&#xff09;项目结构如下 我们看到项目中手动添加了本地lib资源&#xff0c;同时bootspring的配置文件和mapper文件也放在了resouces目录中。 2&#xff09;上述结构的项目在使用maven打包时&#xff0c;最终生成的jar文件中将不包含lib库文件&#xff0c;甚…

【短视频矩阵系统==saas技术开发】

在数字媒体领域&#xff0c;短视频的崛起已不可忽视。对于商业实体而言&#xff0c;掌握如何通过短视频平台有效吸引潜在客户并提高转化率&#xff0c;已成为一项关键课题。本文旨在深入剖析短视频矩阵系统的构成与作用机制&#xff0c;以期为企业提供一套系统化的策略&#xf…

C_字符串的一些函数

1.字符串输入函数 scanf("%s",数组名)&#xff1b; gets(数组名)&#xff1b; 区别&#xff1a; scanf(“%s”,数组名); 把空格识别为输入结束 #include <stdio.h>int main() {char a[10];printf("输入&#xff1a;");scanf("%s",a)…