JWT令牌(JSON Web Token)
目录
1 前言
2 JWT令牌的组成
3 使用步骤举例
3.1 pom.xml中引入依赖
3.2 JWT生成
3.3 JWT验证
4 实践中的使用举例
4.1 拦截非法访问
4.1.1 编写为工具类
4.1.2 下发给用户
4.1.3 编写拦截器
4.1.4 注册拦截器
4.2 获取相关数据提升效率
1 前言
在我们编写的后端程序中,如果没有进行相关处理,那么就可能出现绕过登录,直接访问相关接口的情况。因此,我们引入了JWT令牌(一段特殊的字符串)。此外,使用JWT令牌,还要如下好处:
①减少查询数据库的次数,提高性能
②防止篡改,提高安全性
2 JWT令牌的组成
hdoj1u901jd.q0hd=kd.dhiwihdih(随便弄的,演示一下)
以.为分隔,我们可以将JWT令牌拆解成三部分
第一部分(Header/头):记录令牌类型和签名算法等
第二部分(Payload/有效载荷):携带一些自定义信息,如:id和用户名,不宜包含密码。因为JWT是依赖于Base64生成的,而Base64只是一种编码方式而非加密,携带密码就不安全
第三部分(Signature/签名):防止篡改,确保安全性,由前两部分+秘钥通过加密算法得到
3 使用步骤举例
3.1 pom.xml中引入依赖
<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.4.0</version>
</dependency>
3.2 JWT生成
public class JwtTest {@Testpublic void testGenerate() {Map<String, Object> claims = new HashMap<>();claims.put("id", 5);claims.put("username", "zy");//生成jwt的代码String token = JWT.create().withClaim("user", claims)//添加载荷.withExpiresAt(new Date(System.currentTimeMillis() + 1000*60*60*2))//添加过期时间.sign(Algorithm.HMAC256("test"));//指定算法,配置秘钥System.out.println(token);}
}
3.3 JWT验证
public class JwtTest {/*** JWT校验报错(失败)的两种情况:* 1.JWT被修改* 2.token过期*/@Testpublic void testParse() {//testGenerate()生成的的字符串,模拟用户传递过来的tokenString token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" +".eyJ1c2VyIjp7ImlkIjo1LCJ1c2VybmFtZSI6Inp5In0sImV4cCI6MTcwNjE3NjYxMX0" +".bTpMAeawJ3u9-d2PKL2JIhynwGjTPZlkp1RIREwMDVc";JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("test")).build();DecodedJWT decodedJWT = jwtVerifier.verify(token);//验证token,生成一个解析后的JWT对象Map<String, Claim> claims = decodedJWT.getClaims();//获得载荷System.out.println(claims.get("user"));}
}
4 实践中的使用举例
4.1 拦截非法访问
4.1.1 编写为工具类
public class JwtUtil {//自定义秘钥private static final String KEY = "XXXX";//接收业务数据,生成token并返回public static String genToken(Map<String, Object> claims) {return JWT.create().withClaim("claims", claims)//添加载荷.withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 ))//设置过期时间.sign(Algorithm.HMAC256(KEY));//选择加密算法}//接收token,验证token,并返回业务数据public static Map<String, Object> parseToken(String token) {return JWT.require(Algorithm.HMAC256(KEY)).build().verify(token).getClaim("claims").asMap();}}
4.1.2 下发给用户
@RestController
@RequestMapping("/user")
public class UserController {@PostMapping("/login")public Result<String> login(String username, String password) {//其它代码...User loginUser = userService.findByUserName(username);Map<String, Object> claims = new HashMap<>();claims.put("id", loginUser.getId());claims.put("username", loginUser.getUsername());String token = JwtUtil.genToken(claims);return Result.success(token);}//其它代码...
}
4.1.3 编写拦截器
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {try {//xxx为约定好的请求头中携带的名称Map<String, Object> claims = JwtUtil.parseToken(request.getHeader("xxx"));//放行return true;} catch (Exception e) {response.setStatus(401);//约定好的状态码,一般401表示未授权//不放行return false;}}
}
4.1.4 注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//不拦截注册和登录接口registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login", "/user/register");}
}
大功告成,如果未登录访问接口,就会401。
4.2 获取相关数据提升效率
我们可以在请求头中获取有效载荷中的有效信息。
//token中包含id和username
public Result<User> func(@RequestHeader(name = "XXX") String token) {Map<String, Object> map = JwtUtil.parseToken(token);String username = (String)map.get("username");User user = userService.findByUserName(username);return Result.success(user);
}
相关文章:
JWT令牌(JSON Web Token)
目录 1 前言 2 JWT令牌的组成 3 使用步骤举例 3.1 pom.xml中引入依赖 3.2 JWT生成 3.3 JWT验证 4 实践中的使用举例 4.1 拦截非法访问 4.1.1 编写为工具类 4.1.2 下发给用户 4.1.3 编写拦截器 4.1.4 注册拦截器 4.2 获取相关数据提升效率 1 前言 在我们编写的后端…...

华硕ASUS K43SD笔记本安装win7X64(ventoy为入口以支撑一盘多系统);友善之臂mini2440开发板学习
记录 老爷机 白色 华硕 K43SD 笔记本 安装 win7X64 1. MBR样式常规安装win7X64Sp1 (华硕 K43SD 安装 win7X64 ) 老爷机 白色 华硕 K43SD 笔记本 安装 win7X64 (常规安装) 设置: 禁用UEFI 启用AHCI ventoy制作MBR(非UEFI)方式的启动U盘 U盘中放cn_windows_7_ultimate_wit…...
npm设置源(原淘宝源域名已过期)
今天打包机器报错, Couldnt find package "antd-mobile2.3.4" required by "neo-ui-mf-base1.0.41" on the "npm" registry. 找不到antd mobile的包,查看源发现淘宝域名npm.taobao.org 和 registry.npm.taobao.org 域名…...

操作系统-进程通信(共享存储 消息传递 管道通信 读写管道的条件)
文章目录 什么是进程通信为什么进程通信需要操作系统支持共享存储消息传递直接通信方式间接通信方式 管道通信小结注意 什么是进程通信 分享吃瓜文涉及到了进程通信 进程通信需要操作系统支持 为什么进程通信需要操作系统支持 进程不能访问非本进程的空间 当进程P和Q需要…...

NODE笔记 2 使用node操作飞书多维表格
前面简单介绍了node与简单的应用,本文通过结合飞书官方文档 使用node对飞书多维表格进行简单的操作(获取token 查询多维表格recordid,删除多行数据,新增数据) 文章目录 前言 前两篇文章对node做了简单的介绍ÿ…...
Scikit-Learn 高级教程——自定义评估器
Python Scikit-Learn 高级教程:自定义评估器 Scikit-Learn 提供了许多内置的评估器(Estimator)来进行机器学习任务,但在某些情况下,我们可能需要自定义评估器以满足特定需求。本篇博客将深入介绍如何在 Scikit-Learn …...

6 时间序列(不同位置的装置如何建模): GRU+Embedding
很多算法比赛经常会遇到不同的物体产生同含义的时间序列信息,比如不同位置的时间序列信息,风力发电、充电桩用电。经常会遇到该如此场景,对所有数据做统一处理喂给模型,模型很难学到区分信息,因此设计如果对不同位置的…...
Git 基本概念
Git是一种版本控制系统,用于跟踪文件的更改并协同开发代码。它具有以下基本概念和使用方式: 仓库(Repository):Git将文件存储在仓库中,它是保存项目历史记录和更改的地方。一个项目通常有一个主要的仓库。 …...
android:excludeFromRecents
android:excludeFromRecents 基础从根上影响 TaskexcludeFromRecents 属性可能会影响系统 基础 android:excludeFromRecents是一种在Android应用程序清单文件(AndroidManifest.xml)中使用的属性,用于指定一个Activity是否应该在最近任务列表…...

微信小程序登录获取手机号教程(超详细)
1. 背景介绍: 在我们开发微信小程序时,登录时,需要获取用户手机号作为唯一标识,下面我介绍一下获取手机号的教程。 本篇文章介绍后端获取方法: 前端工作 后端工作 前端 新建Page页面,在xxx.wxml中加入…...

uniapp app更新
uniapp app更新 这个版本要随之增加,不然刚更新时直接用app, 新包增加的那些页面跳转会有问题,不能跳新的页面 //app更新检测 updataApp(){const that this;uni.showLoading({title:加载中...})plus.runtime.getProperty(plus.runtime.appid, functio…...

C语言第八弹---一维数组
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 一维数组 1、数组的概念 2、⼀维数组的创建和初始化 2.1、数组创建 2.2、数组的初始化 2.3、数组的类型 3、⼀维数组的使用 3.1、数组下标 3.2、数组元素…...

科普栏目 | 水离子水壁炉是如何打造清新环境,提升居家生活?
现代生活中,人们对于居家环境的品质有着越来越高的要求。水离子水壁炉作为一种创新科技,通过其独特的功能,为居家生活带来了一系列的提升。 1.采用先进的技术,减少了对传统能源的依赖,让我们在提高生活品质的同时&…...
python 进程
1创建一个爬虫程序 import requests urls [https://www.cnblogs.com/#p{page}for page in range(1, 501) ]def craw(url):r requests.get(url)print(url, len(r.text))craw(urls[0])2定义单进程和多进程 import blob_spider import threading import timedef single_thread…...

网络编程套接字(1)
网络编程基础 为什么需要网络编程? --丰富的网络资源 用户在浏览器中,打开在线视频网站,如优酷看视频,实质通过网络,获取到网络上的一个视频资源 与本地打开视频文件类似,只是视频文件这个资源的来源是网络. 相比于本地资源来说,网络提供了更为丰富的网络资源: 所谓的网络…...
harmonyOS app 开发环境配置流程
1.安装DevEco Studio,注意nodejs版本,安装过程中有提示,添加hdc到系统环境变量中,用于调用hdc命令 2.开启真机设备的开发人员选项,以及开启5555端口(需要连接usb线) https://developer.harmonyo…...

【嵌入式学习】C++QT-Day2-C++基础
笔记 见我的博客:https://lingjun.life/wiki/EmbeddedNote/19Cpp 作业 自己封装一个矩形类(Rect),拥有私有属性:宽度(width)、高度(height), 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度…...

新手基础易懂的创建javaweb项目的方法(适用于IDEA 2023版)
新手基础易懂的创建javaweb项目的方法 前言我的IDEA版本新建项目步骤1步骤2步骤3步骤4步骤5步骤6<font colorred>特别注意,一定要注意步骤7步骤8 配置Tomcat服务器步骤9步骤10步骤11步骤12步骤13修改前修改后 步骤14 点击修复修改前修改后 试运行 前言 创建ja…...

决策树的基本构建流程
决策树的基本构建流程 决策树的本质是挖掘有效的分类规则,然后以树的形式呈现。 这里有两个重点: 有效的分类规则;树的形式。 有效的分类规则:叶子节点纯度越高越好,就像我们分红豆和黄豆一样,我们当然…...

[极客大挑战 2019]Upload1
直接上传php一句话木马,提示要上传image 把文件名改成gif并加上gif文件头后,绕过了对image类型的检测,但是提示文件内含有<?,且bp抓包后改回php也会被检测 那我们考虑使用js执行php代码 <script languagephp>eval($_PO…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...