【SpringBoot篇】登录校验 — JWT令牌

文章目录

  • 🌹简述JWT令牌
    • ⭐JWT特点
  • 🌺JWT使用流程
  • 🛸JWT令牌代码实现
  • 🍔JWT应用

在这里插入图片描述

🌹简述JWT令牌

JWT全称为JSON Web Token,是一种用于身份验证的开放标准。它是一个基于JSON格式的安全令牌,主要用于在网络上传输声明或者用户身份信息。JWT通常被用作API的认证方式,以及跨域身份验证。

JWT令牌由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature)。头部包含了令牌使用的加密算法信息,载荷包含了所需传输的用户信息,签名用于保证令牌的完整性和真实性,防止令牌被篡改。
请添加图片描述
请添加图片描述

官网https://jwt.io/

⭐JWT特点

  • 可以跨语言、跨平台使用,因为它是基于JSON标准的。
  • 可以直接嵌入到HTTP请求头中,方便传输和验证。
  • 令牌的有效期可以通过设置过期时间来进行控制,提高了安全性。
  • 由于令牌中包含了用户信息,因此可以避免频繁查询数据库的情况出现,提高了系统的性能。

🌺JWT使用流程

用户向服务器发送登录请求,服务器进行身份验证,如果验证成功则返回一个JWT令牌给客户端。

客户端收到JWT令牌后,将其保存在本地。每次向服务器发送请求时,在请求的头部中携带该令牌,以便服务器对请求进行身份验证。

服务器收到请求后,从请求头中提取JWT令牌,并进行解析和验证。如果令牌有效,则允许请求继续执行;否则返回错误信息。

生成令牌,校验令牌
请添加图片描述
在服务端拦截所有的请求,判断算法有合法的jwt请求,如果有,直接放行,否则进行拦截

🛸JWT令牌代码实现

我把代码脚手架传到网盘里面了,大家跟着代码来学习
我用夸克网盘分享了「tlias-web-management」,点击链接即可保存。
链接:https://pan.quark.cn/s/1f4f6c129be8

添加依赖

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

生成JWT令牌

 //生成jwt@Testpublic void testGenJwt(){Map<String, Object> claims = new HashMap<>();claims.put("id",1);claims.put("name","Tom");String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS512, "itheima")  //签名算法.setClaims(claims)   //自定义内容//有参构造方法.setExpiration(new Date(System.currentTimeMillis()+3600))  //令牌过期时间.compact();System.out.println(jwt);}

在这里插入图片描述
运行后发现,出现了jwt令牌
在这里插入图片描述
我们把这一段jwt令牌复制粘贴到jwt官网进行解析一下

https://jwt.io/

在这里插入图片描述
解析jwt令牌
(相当于校验令牌,只要解析令牌不报错,就相当于校验jwt令牌正确)

   //解析jwt@Testpublic void testParseJwt() {Claims claims=Jwts.parser().setSigningKey("itheima")//写入你刚才运行出来的jwt令牌.parseClaimsJws("eyJhbGciOiJIUzUxMiJ9.eyJuYW1lIjoiVG9tIiwiaWQiOjEsImV4cCI6MTcwMDcyMzQ1M30.GMp1Z-osnaOJ08nM3uswPKRFIaKS4e6_UvZXq2Q4QjYBFRcJNk7WgQRkFJHXIUrZfKovXUZhd8-OOKtXYDyrbg").getBody();System.out.println(claims);}

在这里插入图片描述
解析出来了
在这里插入图片描述

可能会发生这种报错,是因为jwt令牌过期了,重新生成一个即可
在这里插入图片描述


🍔JWT应用

我们接着上面的代码写,引入jwt工具类

在这里插入图片描述

package com.itheima.utils;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;import java.util.Date;
import java.util.Map;public class JwtUtils {private static String signKey = "itheima";	//签名密钥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;}
}

创建LoginController,里面包含了生成jwt令牌的代码
在这里插入图片描述

package com.itheima.controller;import com.itheima.pojo.Emp;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@Slf4j
@RestController
public class LoginController {@Autowiredprivate EmpService empService;@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());String jwt = JwtUtils.generateJwt(claims); //jwt包含了当前登录的员工信息return Result.success(jwt);}//登录失败, 返回错误信息return Result.error("用户名或密码错误");}}

在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!

在这里插入图片描述

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

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

相关文章

跨越威胁的传说:揭秘Web安全的七大恶魔

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

CVE-2022-4886 ingress命令注入复现与分析

安装 安装ingress-nginx wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.4/deploy/static/provider/cloud/deploy.yamlk apply -f deploy.yaml 原理 nginx.ingress.kubernetes.io/rewrite-target标签会在nginx配置进行插入字符串&#…

Linux - 动静态库(下篇)

前言 在上篇博客当中&#xff0c;对静态库是什么&#xff0c;怎么使用&#xff0c;简单实现自己的静态库&#xff0c;这些做了描述&#xff0c;具体请看上篇博客&#xff1a; 本篇博客将会对 动态库是什么&#xff0c;怎么使用&#xff0c;简单实现自己的动态库&#xff0c…

ESP32-Web-Server 实战编程-使用文件系统建立强大的 web 系统

ESP32-Web-Server 实战编程-使用文件系统建立强大的 web 系统 概述 在前述章节我们讲述了在网页端控制多个 GPIO 的案例。当程序开始变得复杂&#xff0c;让一些功能“自动起来”是一个好的选择。 在前面的示例中&#xff0c;我们需要在后端为每个前端代码的 URL 指定一个对…

Android RecyclerView分析 第一篇【ChildHelper】

一、在RecyclerView中的位置与角色 在RecyclerView对象创建时&#xff0c;会创建一个 ChildHelper 对象。 在设置layoutManager时&#xff0c;将 RecyclerView中的成员变量 mChildHelper 传进 layoutManager中。 ChildHelper 封装了对 RecyclerView所有子View的所有操作。包括…

播放器开发(五):视频帧处理并用SDL渲染播放

目录 学习课题&#xff1a;逐步构建开发播放器【QT5 FFmpeg6 SDL2】 步骤 VideoOutPut模块 1、初始化【分配缓存、读取信息】 2、开始线程工作【从队列读帧->缩放->发送渲染信号到窗口】 VideoWidget自定义Widget类 1、定义内部变量 2、如果使用SDL&#xff0c;需要进…

Matplotlib直方图的创建_Python数据分析与可视化

Matplotlib直方图的创建 概念区分绘制直方图 概念区分 什么是直方图&#xff1f; 直方图&#xff08;Histogram&#xff09;又称质量分布图&#xff0c;是统计报告图的一种&#xff0c;由一系列高度不等的纵向条纹或线段表示数据分布的情况&#xff0c;一般用横轴表示数据所属…

探索性数据分析(EDA):从数据中发现洞察力

写在开头 在数据科学的世界中,探索性数据分析(Exploratory Data Analysis,EDA)是一项至关重要的任务,它能够帮助我们深入了解数据、发现潜在的模式,并为进一步的分析和建模提供基础。本篇博客将介绍探索性数据分析的基本技术和方法,通过具体的数字、场景和代码,帮助读…

解锁文件安全新境界!迅软DSE带您领略数据加密的魅力!

随着信息技术的不断发展&#xff0c;企业数据信息的安全与保护受到愈发广泛的关注。而文件加密软件得益于其强大的系统功能能够有效地保护企业重要数据的隐私和安全&#xff0c;成为越来越多企事业单位在进行内部数据安全防护工作时的优选。 一、文件加密软件的作用 文件加密软…

国产数据库

当今世界&#xff0c;数据已成为重要的生产要素&#xff0c;数据库管理系统更是广泛应用于信息化行业各领域&#xff0c;国内数据库产业能否健康可持续的发展&#xff0c;在很大程度上影响着国民经济发展和网络空间安全。 当前&#xff0c;国产数据库行业竞争非常激烈&#xf…

c++基础----new

c基础----new 在C中&#xff0c;new是一个运算符&#xff0c;用于动态分配内存并返回指向该内存的指针。它可以用于创建单个对象、数组以及动态分配的对象。 下面是new的几种常见用法&#xff1a; 动态分配单个对象&#xff1a; int* ptr new int; // 动态分配一个int类型…

Wi-Fi标准

Wi-Fi 标准 记录关于Wi-Fi 标准 Wi-Fi 6&#xff08;802.11ax&#xff09;&#xff1a; 这是目前最新的无线网络标准&#xff0c;提供了更高的速度、更好的性能和更高的容量。Wi-Fi 6支持更多的设备连接、更快的速度和更低的延迟&#xff0c;因此是为未来的高密度无线网络设…

HCIE 01:基于前缀列表的BGP ORF功能

当运行BGP协议的某台设备上&#xff0c;针对入方向配置了基于ip-prefix的路由过滤&#xff0c;过滤了邻居发送的路由&#xff1b; 目前想&#xff0c;通过在peer关系的两端设备上都配置ORF功能&#xff0c;实现路由发送端只能送路由接收端过滤后的路由&#xff1b; ORF功能的说…

总结vue3 的一些知识点:MySQL 排序

MySQL 排序 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。 如果我们需要对读取的数据进行排序&#xff0c;我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序&#xff0c;再返回搜索结果。 语法 以下是 SQL SELECT 语句使用 ORDER B…

Sedex 验厂有证书的吗

【Sedex 验厂有证书的吗】 SEDEX是一家总部设在英国伦敦的非赢利组织&#xff0c;世界上任何地点的公司都可以申请会员资格。SEDEX已获得了许多大型零售商和生产商的青睐&#xff0c;许多零售商、超市、品牌商、供应商和其它组织都要求与之合作的农场、工厂和制造商参加SEDEX成…

Leetcode—1670.设计前中后队列【中等】

2023每日刷题&#xff08;四十三&#xff09; Leetcode—1670.设计前中后队列 实现代码 erase(iterator position)在删除vector中的元素后&#xff0c;会将该元素的后面所有元素都往前挪一位。因此&#xff0c;原先的迭代器指向的元素就不是原来那个了&#xff0c;而是它的后…

2023年05月 Scratch图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共10题,每题3分,共30分) 第1题 下列积木运行后的结果是?( )(说明:逗号后面无空格) A:我 B:爱 C:中 D:国 答案:B 两个字符串连接后的第8个字符是“爱”。 第2题 接鸡蛋游戏中,天空掉下来有鸡蛋、石…

Flink Flink中的合流

一、Flink中的基本合流操作 在实际应用中&#xff0c;我们经常会遇到来源不同的多条流&#xff0c;需要将它们的数据进行联合处理。所以 Flink 中合流的操作会更加普遍&#xff0c;对应的 API 也更加丰富。 二、联合&#xff08;Union&#xff09; 最简单的合流操作&#xf…

开源免费跨平台数据同步工具-Syncthing

Syncthing是一款开源免费跨平台的文件同步工具&#xff0c;是基于P2P技术实现设备间的文件同步&#xff0c;所以它的同步是去中心化的&#xff0c;即你并不需要一个服务器&#xff0c;故不需要担心这个中心的服务器给你带来的种种限制&#xff0c;而且类似于torrent协议&#x…

卡码网语言基础课 | 16. 出现频率最高的字母

目录 一、 哈希表 二、 编写解题 2.1 统计出现次数 2.2 解答 通过本次练习&#xff0c;将学习到C中哈希表的基础知识 题目&#xff1a; 给定一个只包含小写字母的字符串&#xff0c;统计字符串中每个字母出现的频率&#xff0c;并找出出现频率最高的字母&#xff0c;如果…