当前位置: 首页 > news >正文

登录—令牌技术

这里写目录标题

    • 令牌技术
      • 2.4.1 JWT令牌
      • 2.4.2 jwt使用

令牌技术

令牌,其实它就是一个用户身份的标识,其实本质就是一个字符串。

在这里插入图片描述

如果通过令牌技术来跟踪会话,就可以在浏览器发起请求。在请求登录接口的时候,如果登录成功,可以生成一个令牌,令牌就是用户的合法身份凭证。接下来响应数据的时候,可以直接将令牌响应给前端。

接下来在前端程序当中接收到令牌之后,就需要将这个令牌存储起来。这个存储可以存储在 cookie 当中,也可以存储在其他的存储空间(比如:localStorage)当中。

接下来,在后续的每一次请求当中,都需要将令牌携带到服务端。携带到服务端之后,接下来我们就需要来校验令牌的有效性。如果令牌是有效的,就说明用户已经执行了登录操作,如果令牌是无效的,就说明用户之前并未执行登录操作。

此时,如果是在同一次会话的多次请求之间,我们想共享数据,我们就可以将共享的数据存储在令牌当中就可以了。

优缺点

  • 优点:
    • 支持PC端、移动端
    • 解决集群环境下的认证问题
    • 减轻服务器的存储压力(无需在服务器端存储)
  • 缺点:需要自己实现(包括令牌的生成、令牌的传递、令牌的校验)

2.4.1 JWT令牌

JWT全称:JSON Web Token (官网:https://jwt.io/)

  • 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。

JWT的组成:(JWT令牌由三个部分组成,三个部分之间使用英文的点来分割)

  • 第一部分:Header(头), 记录令牌类型、签名算法等。 例如:{“alg”:“HS256”,“type”:“JWT”}

  • 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{“id”:“1”,“username”:“Tom”}

  • 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。

在这里插入图片描述

其实在生成JWT令牌时,会对JSON格式的数据进行一次编码:进行base64编码

Base64:是一种基于64个可打印的字符来表示二进制数据的编码方式。既然能编码,那也就意味着也能解码。所使用的64个字符分别是A到Z、a到z、 0- 9,一个加号,一个斜杠,加起来就是64个字符。任何数据经过base64编码之后,最终就会通过这64个字符来表示。当然还有一个符号,那就是等号。等号它是一个补位的符号

需要注意的是Base64是编码方式,而不是加密方式。

JWT令牌最典型的应用场景就是登录认证:

  1. 在浏览器发起请求来执行登录操作,此时会访问登录的接口,如果登录成功之后,我们需要生成一个jwt令牌,将生成的 jwt令牌返回给前端。
  2. 前端拿到jwt令牌之后,会将jwt令牌存储起来。在后续的每一次请求中都会将jwt令牌携带到服务端。
  3. 服务端统一拦截请求之后,先来判断一下这次请求有没有把令牌带过来,如果没有带过来,直接拒绝访问,如果带过来了,还要校验一下令牌是否是有效。如果有效,就直接放行进行请求的处理。

2.4.2 jwt使用

引入依赖

 <!--jwt令牌--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>

生成jwt

// 生成jwt@Testpublic void generateToken() {// JWT头部分信息【Header】Map<String, Object> header = new HashMap<>();header.put("alg", "HS256");header.put("typ", "JWT");// 载核【Payload】Map<String, Object> payload = new HashMap<>();payload.put("sub", "1234567890");payload.put("name", "kwh");payload.put("admin", true);// 声明Token失效时间Calendar instance = Calendar.getInstance();instance.add(Calendar.SECOND, 300);// 300s// 生成TokenString token = Jwts.builder().setHeader(header)// 设置Header.setClaims(payload) // 设置载核.setExpiration(new Date(System.currentTimeMillis() +3600 *1000))// 设置生效时间.signWith(SignatureAlgorithm.HS256, "secret") // 签名,这里采用私钥进行签名.compact(); // 压缩生成xxx.xxx.xxxSystem.out.println(token);}

解析jwt令牌

// 解析jwt令牌@Testpublic void getInfoByJwt() {// 生成的tokenString token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImV4cCI6MTczMDcyNjM2M30.HjTmlXF0gdli6yD-1ZL95FOl8LJOwxRvVTycB8Elyu4";// 解析head信息JwsHeader jwsHeader = Jwts.parser().setSigningKey("secret").parseClaimsJws(token).getHeader();// {typ=JWT, alg=HS256}System.out.println(jwsHeader);System.out.println("1111111");//typ:JWTSystem.out.println("typ:"+jwsHeader.get("typ"));// 解析PayloadClaims claims = Jwts.parser().setSigningKey("secret").parseClaimsJws(token).getBody();System.out.println(claims);// {sub=1234567890, name=John Doe, admin=true, exp=1663297431}System.out.println("2222222");//admin:trueSystem.out.println("admin:"+claims.get("admin"));// 解析SignatureString signature =Jwts.parser().setSigningKey("secret")//指定签名密钥.parseClaimsJws(token)//解析令牌.getSignature();System.out.println(signature); //Ju5EzKBpUnuIRhDG1SU0NwMGsd9Jl_8YBcMM6PB2C20}

登录示例代码:

utlis包下有JwtUtils工具类

public class JwtUtils {private static String signKey = "secret";private static Long expire = 43200000L;//指定失效时间/*** 生成JWT令牌* @param claims JWT第二部分负载 payload 中存储的内容* @return*/public static String generateJwt(Map<String, Object> claims){String jwt = Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey).setExpiration(new Date(System.currentTimeMillis() + expire)).compact();return jwt;}/*** 解析JWT令牌* @param jwt JWT令牌* @return JWT第二部分负载 payload 中存储的内容*/public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt).getBody();return claims;}
}
 @PostMapping("/login")public Result login(@RequestBody Emp emp) {log.info("员工登录,{}", emp);Emp e = empService.login(emp);if (e != null){Map<String, Object> claims = new HashMap<>();claims.put("id",e.getId());claims.put("name",e.getName());claims.put("username",e.getUsername());//jwt包含了当前登录的员工信息String jwt = JwtUtils.generateJwt(claims);return Result.success(jwt);//返回给前端}return Result.error("用户或密码错误!!!!!!!!");}
        //jwt包含了当前登录的员工信息String jwt = JwtUtils.generateJwt(claims);return Result.success(jwt);//返回给前端}return Result.error("用户或密码错误!!!!!!!!");
}

相关文章:

登录—令牌技术

这里写目录标题 令牌技术2.4.1 JWT令牌2.4.2 jwt使用 令牌技术 令牌&#xff0c;其实它就是一个用户身份的标识&#xff0c;其实本质就是一个字符串。 如果通过令牌技术来跟踪会话&#xff0c;就可以在浏览器发起请求。在请求登录接口的时候&#xff0c;如果登录成功&#xff…...

NPOI 操作详解(操作Excel)

目录 1. 安装 NPOI 2. 使用 NPOI 创建新 Excel 文件 3. 设置列宽和行高 1. 设置列宽 2. 设置行高 3. 同时设置列宽和行高 4. 设置统一的行高 5. 设置统一的列宽 6. 应用统一的行高和列宽 4. 合并单元格 5. 设置单元格样式&#xff08;字体、边框、背景色等&#xf…...

2024年北京海淀区中小学生信息学竞赛校级预选赛试题

2024年北京海淀区中小学生信息学竞赛校级预选赛试题 题目总数&#xff1a;24 总分数&#xff1a;100 编程基础知识单选题 第 1 题 单选题 关于 2024年海淀区信息学竞赛的描述错误的是( ) A.报名在网上报名系统进行 B.必须经过学籍所在学校的指导教师审核 C.学校…...

GPT-SoVITS 部署方案

简介 当前主流的开源TTS框架&#xff0c;这里介绍部署该服务的主要流程和我在使用过程中出现的问题。 使用的技术 Docker、Jupyter、Python、C# 部署 docker的使用 拉取命令 docker pull jupyter/base-notebook:python-3.10.11jupyter的访问 docker运行以后可以直接使用…...

pdf添加目录标签python(手动配置)

先安装对应的库: pip install pypdf 代码分为两个部分,一部分是config.py,代码如下: offset=10 catgorys=[("第一章",12),("第二章",45), ] 需要自己手动更改offset,和目录列表 下面是主要代码: import pypdf # import sys from config import…...

Ngrok 在树莓派上的配置与使用教程

Ngrok 是一个便捷的工具&#xff0c;用于将本地服务器暴露到互联网上&#xff0c;常用于开发和调试。 1. 更新树莓派 首先&#xff0c;更新树莓派的系统&#xff1a; sudo apt update sudo apt upgrade -y2. 安装 Ngrok &#xff08;1&#xff09;下载 Ngrok&#xff1a; 访…...

多核架构的基本概念

目录 1.为什么使用多核 2.多核分类 2.1 同构和异构 2.2 SMP和AMP 3 小结 1.为什么使用多核 这个问题个人认为可以从两个方面来看&#xff1a; 性能问题 随着汽车ECU对集成化的要求越来越高&#xff0c;把多个ECU功能集中到一个多核MCU的需求也越来越明显。 以汽车制动…...

yolov8模型推理测试代码(pt/onnx)

&#x1f996;yolov8训练出来的模型&#xff0c;不使用detect.py代码进行模型测试&#x1f996; pt格式模型测试 import cv2 import os from ultralytics import YOLO # 定义输入和输出文件夹路径 input_folder /input/folder # 输入文件夹 output_folder /output/folder …...

二叉树 最大深度(递归)

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出…...

C++详细笔记(五)

1.类和对象 1.1运算符重载&#xff08;补&#xff09; 1.运算符重载中&#xff0c;参数顺序和操作数顺序是一致的。 2.一般成员函数重载为成员函数&#xff0c;输入流和输出流重载为全局函数。 3.由1和2只正常的成员函数默认第一个参数为this指针而重载中参数顺序和操作数顺…...

简易CPU设计入门:译码模块(一)

项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff…...

力扣题目解析--三数之和

题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示…...

qt QTabWidget详解

1、概述 QTabWidget是Qt框架中的一个控件&#xff0c;它提供了一个标签页式的界面&#xff0c;允许用户在不同的页面&#xff08;或称为标签&#xff09;之间切换。每个页面都可以包含不同的内容&#xff0c;如文本、图像、按钮或其他小部件。QTabWidget非常适合用于创建具有多…...

linux shell脚本学习(1):shell脚本基本概念与操作

1.什么是shell脚本 linux系统中&#xff0c;shell脚本或称之为bash shell程序&#xff0c;通常是由vim编辑&#xff0c;由linux命令、bash shell指令、逻辑控制语句、注释信息组成的可执行文件 *linux中常以.sh后缀作为shell脚本的后缀。linux系统中文件乃至脚本的后缀并没有…...

Savitzky-Golay(SG)滤波器

Savitzky-Golay&#xff08;SG&#xff09;滤波器是一种在时域内基于局域多项式最小二乘法拟合的滤波方法&#xff0c;它最初由Savitzky A和Golay M于1964年提出&#xff0c;并广泛应用于数据流平滑除噪。 基本介绍 一、基本原理 SG滤波器通过在滑动窗口内拟合多项式来平滑数…...

Webserver(2.7)共享内存

目录 共享内存共享内存实现进程通信 共享内存 共享内存比内存映射效率更高&#xff0c;因为内存映射关联了一个文件 共享内存实现进程通信 write.c #include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <string.h>int main(){…...

【网安案例学习】凭证填充Credential Stuffing

### 凭证填充的深入讨论 凭证填充&#xff08;Credential Stuffing&#xff09;是一种网络攻击技术&#xff0c;攻击者利用从数据泄露中获取的大量用户名和密码组合&#xff0c;尝试在其他网站和服务上进行自动化登录。这种攻击依赖于用户在多个网站上重复使用相同密码的习惯。…...

网站建设公司怎么选?网站制作公司怎么选才不会出错?

寻找适合靠谱的网站设计公司&#xff0c;不要盲目选广告推最多的几家&#xff0c;毕竟要实现自身品牌营销&#xff0c;还是需要多方面考量。以下几个方面可以作为选择的参考&#xff1a; 1. 专业能力如何&#xff1f; 一个公司的专业能力&#xff0c;决定了最后网站设计的成果…...

19. 架构重要需求

文章目录 第19章 架构重要需求19.1 从需求文档中收集架构重要需求&#xff08;ASRs&#xff09;不要抱太大希望从需求文档中找出架构重要需求 19.2 通过访谈利益相关者收集架构重要需求19.3 通过理解业务目标收集架构重要需求19.4 在效用树中捕获架构重要需求19.5 变化总会发生…...

iOS 再谈KVC、 KVO

故事背景&#xff1a;大厂面试&#xff0c;又问道了基本的kvc kvo的原理和使用&#xff0c;由于转了前端&#xff0c;除了个setter和getter&#xff0c;我全忘记了&#xff0c;其实还是没有理解记忆&#xff0c;下面再看一下kvc 和kvo ,总结一个让人通过理解而无法忘记的方法&a…...

图图的嗨丝造相-Z-Image-Turbo保姆级教学:提示词中‘蓝色校服’‘黑色低帮鞋’等实体关联

图图的嗨丝造相-Z-Image-Turbo保姆级教学&#xff1a;提示词中‘蓝色校服’‘黑色低帮鞋’等实体关联 你是不是也遇到过这种情况&#xff1a;想用AI生成一张特定风格的图片&#xff0c;比如一个穿着蓝色校服、黑色低帮鞋&#xff0c;搭配渔网袜的校园少女&#xff0c;但写出来…...

忍者像素绘卷镜像免配置部署:自动检测GPU型号并加载最优配置

忍者像素绘卷镜像免配置部署&#xff1a;自动检测GPU型号并加载最优配置 1. 产品概览&#xff1a;打破次元壁的像素艺术工作站 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站&#xff0c;专为像素艺术创作而设计。它将传统漫画创作与现代AI技术相结合&#x…...

Face Analysis WebUI在金融领域的应用:远程开户身份核验

Face Analysis WebUI在金融领域的应用&#xff1a;远程开户身份核验 1. 引言 想象一下这样的场景&#xff1a;一位偏远地区的客户想要开设银行账户&#xff0c;但最近的银行网点在100公里外。传统方式下&#xff0c;他需要亲自前往网点&#xff0c;排队等待&#xff0c;提交各…...

判断一个链表是否是环形链表

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索…...

乙巳马年春联生成终端参数详解:长文本生成稳定性保障机制

乙巳马年春联生成终端参数详解&#xff1a;长文本生成稳定性保障机制 1. 引言&#xff1a;当传统春联遇见现代AI 每到新年&#xff0c;家家户户贴春联是传承千年的习俗。一副好春联&#xff0c;不仅要对仗工整、平仄协调&#xff0c;更要蕴含美好的寓意。但创作一副原创的、有…...

Stable Diffusion工作流升级:Pixel Fashion Atelier预设Prompt库详解

Stable Diffusion工作流升级&#xff1a;Pixel Fashion Atelier预设Prompt库详解 1. 项目概述 像素时装锻造坊&#xff08;Pixel Fashion Atelier&#xff09;是一款基于Stable Diffusion与Anything-v5模型的图像生成工作站。这个创新工具将复古日系RPG的视觉风格与现代AI图像…...

iOS设备安全定制指南:使用Cowabunga Lite实现零风险个性化配置

iOS设备安全定制指南&#xff1a;使用Cowabunga Lite实现零风险个性化配置 【免费下载链接】CowabungaLite iOS 15 Customization Toolbox 项目地址: https://gitcode.com/gh_mirrors/co/CowabungaLite iOS系统的封闭性常让用户陷入个性化与安全性的两难选择——越狱虽能…...

探索DevOps之路:2024年DevOps路线图

探索DevOps之路&#xff1a;2024年DevOps路线图 【免费下载链接】DevOps-Roadmap DevOps Roadmap for 2026. with learning resources 项目地址: https://gitcode.com/GitHub_Trending/de/DevOps-Roadmap 项目介绍 DevOps Roadmap 2024 是一个精心设计的步骤指南&#…...

3种方案解锁Unity游戏潜力:MelonLoader全平台模组加载器实战指南

3种方案解锁Unity游戏潜力&#xff1a;MelonLoader全平台模组加载器实战指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 一…...

onnx之优化器

之前的OpenPPL有个章节讲到过优化器&#xff0c;onnx里面也有个优化器&#xff0c;相关介绍如下一、优化器的本质ONNX Core Optimizer 是在图级别工作的&#xff0c;与EP&#xff08;Execution Provider&#xff09;无关。textONNX模型&#xff08;计算图&#xff09;→ Optimi…...