JAVA开发(JWTUtil工具类实现token源码赏析)

news2025/1/20 3:34:05

一、token解决问题的背景:

     1、 单点登录,

     2、分布式登录状态,

      3、在信任期内 避免 重新输入用户名密码登录。

     4、跨系统免登陆等。

     5、一些接口的请求权限验证。

总结以上token最终都是为了解决在在分布式系统中信任期内 避免 重新输入用户名密码登录。

二、token的常见验证流程:

1、用户提交用户名、密码到服务器后台。

2、后台验证用户信息的正确性。

3、若用户验证通过,服务器端生成Token,返回到客户端。

4、客户端保存Token,再下一次请求资源时,附带上Token信息。

5、服务器端 验证Token是否由服务器签发的。

6、若Token验证通过,则返回需要的资源。

三、那么如何处理token:

1、解决安全问题,就需要加密,和有效期

2、解决信任问题,就要生产包含用户账号,密码相关的信息

3、解决唯一性问题,就要用到签名

4、解决体验问题,就要使用到自动刷新。

上面4点就是实现token的需求。

四、现在以JWTUtil工具类为例看源码是如何现实的:

1、创建token

源码赏析,一共有4种token生产方式。

从传入参数方式中可以看出主要有两个重要信息。

一个是秘钥(或者签名),一个荷载信息(用户登录的相关信息)。那它就可以成为一个凭证了 。

	/**
	 * 创建HS256(HmacSHA256) JWT Token
	 *
	 * @param payload 荷载信息
	 * @param key     HS256(HmacSHA256)密钥
	 * @return JWT Token
	 */
	public static String createToken(Map<String, Object> payload, byte[] key) {
		return createToken(null, payload, key);
	}

	/**
	 * 创建HS256(HmacSHA256) JWT Token
	 *
	 * @param headers 头信息
	 * @param payload 荷载信息
	 * @param key     HS256(HmacSHA256)密钥
	 * @return JWT Token
	 */
	public static String createToken(Map<String, Object> headers, Map<String, Object> payload, byte[] key) {
		return JWT.create()
				.addHeaders(headers)
				.addPayloads(payload)
				.setKey(key)
				.sign();
	}

	/**
	 * 创建JWT Token
	 *
	 * @param payload 荷载信息
	 * @param signer  签名算法
	 * @return JWT Token
	 */
	public static String createToken(Map<String, Object> payload, JWTSigner signer) {
		return createToken(null, payload, signer);
	}

	/**
	 * 创建JWT Token
	 *
	 * @param headers 头信息
	 * @param payload 荷载信息
	 * @param signer  签名算法
	 * @return JWT Token
	 */
	public static String createToken(Map<String, Object> headers, Map<String, Object> payload, JWTSigner signer) {
		return JWT.create()
				.addHeaders(headers)
				.addPayloads(payload)
				.setSigner(signer)
				.sign();
	}

2、token和转换成可解析对象。

这一步是为了能从token转化出可解析的对象信息。

	/**
	 * 解析JWT Token
	 *
	 * @param token token
	 * @return {@link JWT}
	 */
	public static JWT parseToken(String token) {
		return JWT.of(token);
	}

3、检验token,对应的有两种。分别是根据秘钥和签名


	/**
	 * 验证JWT Token有效性
	 *
	 * @param token JWT Token
	 * @param key   HS256(HmacSHA256)密钥
	 * @return 是否有效
	 */
	public static boolean verify(String token, byte[] key) {
		return JWT.of(token).setKey(key).verify();
	}

	/**
	 * 验证JWT Token有效性
	 *
	 * @param token  JWT Token
	 * @param signer 签名器
	 * @return 是否有效
	 */
	public static boolean verify(String token, JWTSigner signer) {
		return JWT.of(token).verify(signer);
	}

整个工具类完整源码:

package cn.hutool.jwt;

import cn.hutool.jwt.signers.JWTSigner;

import java.util.Map;

/**
 * JSON Web Token (JWT)工具类
 */
public class JWTUtil {

	/**
	 * 创建HS256(HmacSHA256) JWT Token
	 *
	 * @param payload 荷载信息
	 * @param key     HS256(HmacSHA256)密钥
	 * @return JWT Token
	 */
	public static String createToken(Map<String, Object> payload, byte[] key) {
		return createToken(null, payload, key);
	}

	/**
	 * 创建HS256(HmacSHA256) JWT Token
	 *
	 * @param headers 头信息
	 * @param payload 荷载信息
	 * @param key     HS256(HmacSHA256)密钥
	 * @return JWT Token
	 */
	public static String createToken(Map<String, Object> headers, Map<String, Object> payload, byte[] key) {
		return JWT.create()
				.addHeaders(headers)
				.addPayloads(payload)
				.setKey(key)
				.sign();
	}

	/**
	 * 创建JWT Token
	 *
	 * @param payload 荷载信息
	 * @param signer  签名算法
	 * @return JWT Token
	 */
	public static String createToken(Map<String, Object> payload, JWTSigner signer) {
		return createToken(null, payload, signer);
	}

	/**
	 * 创建JWT Token
	 *
	 * @param headers 头信息
	 * @param payload 荷载信息
	 * @param signer  签名算法
	 * @return JWT Token
	 */
	public static String createToken(Map<String, Object> headers, Map<String, Object> payload, JWTSigner signer) {
		return JWT.create()
				.addHeaders(headers)
				.addPayloads(payload)
				.setSigner(signer)
				.sign();
	}

	/**
	 * 解析JWT Token
	 *
	 * @param token token
	 * @return {@link JWT}
	 */
	public static JWT parseToken(String token) {
		return JWT.of(token);
	}

	/**
	 * 验证JWT Token有效性
	 *
	 * @param token JWT Token
	 * @param key   HS256(HmacSHA256)密钥
	 * @return 是否有效
	 */
	public static boolean verify(String token, byte[] key) {
		return JWT.of(token).setKey(key).verify();
	}

	/**
	 * 验证JWT Token有效性
	 *
	 * @param token  JWT Token
	 * @param signer 签名器
	 * @return 是否有效
	 */
	public static boolean verify(String token, JWTSigner signer) {
		return JWT.of(token).verify(signer);
	}
}

 

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

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

相关文章

如何选择合适的统计学方法

一般来说&#xff0c;使用哪种统计方法&#xff0c;取决于我们的应用场景、我们的研究目的是什么。 这里面一个麻烦的地方在于&#xff0c;不管你使用哪种统计方法&#xff0c;似乎都可以得出一个’结果’或一个p值&#xff0c;但这个结果有没有意义就两说了。 在我看来&…

【WEB安全】Xstream最新反序列化poc执行报错问题

前言 最近有个需求&#xff0c;用Xstream反序列化打个内存马&#xff0c;从通用性来讲&#xff0c;肯定用1.4.17的洞去打应用范围最广。众所周知&#xff0c;Xstream官方会提供其漏洞的poc。在我实验之下&#xff0c;1.4.17的几个poc只要涉及到任意java代码执行的都会报错&…

VMware创建共享文件夹并实现文件传输(Windows主机,Ubuntu虚拟机)

文章目录创建共享文件夹安装/更新VMware tool挂载共享文件夹共享文件夹的实现更改配置项&#xff0c;实现自动挂载&#xff08;推荐直接用这个&#xff09;数据传输参考博客创建共享文件夹 1、开启虚拟机的共享文件夹配置 首先在虚拟机中打开设置&#xff0c;在选项中点击共享…

Java springboot+vue+MySQLJava大型CRM客户关系管理源码带手机端和小程序源码 Java客户全流程高效管理CRM系统源码

springbootvue MySQL数据库 1. 前端&#xff1a;Vue 2. 后端&#xff1a;Spring boot 3. 数据库&#xff1a;MySQL 源码已经亲测 1. 前端&#xff1a;Vue 2. 后端&#xff1a;Spring boot 3. 数据库&#xff1a;MySQL 小程序是用UNIAPP开发的。 后台登录账户&#xff1a…

(附源码)springboot智能服药提醒app 毕业设计 102151

基于springboot智能服药提醒app 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;智能服药提醒app程序被用户…

平均价格算法:TWAP vs. VWAP

时间加权平均价格 (TWAP) 和成交量加权平均价格 (VWAP) 算法应用不同的方法来计算资产价格&#xff0c;这是所有去中心化金融 (DeFi) 原语的组成部分。 在本文中&#xff0c;我们介绍了 TWAP 和 VWAP 算法之间的差异&#xff0c;解释了它们如何在区块链环境中为资产定价&#…

化学工程与装备杂志化学工程与装备杂志社化学工程与装备编辑部2022年第10期目录

科学研究与开发《化学工程与装备》投稿&#xff1a;cnqikantg126.com 槐木活性炭处理生活废水的研究 孔繁铸;高丽娟;赵开创;钱程; 1-3 基于Pumplinx的水泵机械密封温升仿真研究 赵雪飞;贾红杰;李雪峰;李雷;王景新;张晓辉; 4-728 全固态石墨烯-Ag/AgCl海洋电场探测电…

功率放大器的输入阻抗和输出阻抗是交流还是直流电阻

功率放大器的输入阻抗和输出阻抗一般是指交流电阻。交流电阻指一些伏安特性曲线的斜率。所以放大器输入阻抗和输出阻抗都是理论分析计算为主&#xff0c;而不使用万用表测量其大小。 输入阻抗一般是指电路输入端的等效阻抗&#xff0c;输入端加上一个电压源U&#xff0c;测量输…

WRF模式安装+详细运行教程

安装教程在安装之前&#xff0c;首先需要去查看自己的 Linux 系统&#xff08;虚拟机或者服 务器&#xff09;上的编译环境&#xff0c;也就是确定自己是否安装编译器或安装了哪种编 译器。&#xff08;因为安装过程需要选择编译器&#xff09;常用的编译器分为三种系列&#x…

Typora基础使用技巧

Typora Tutorial 1.数学符号及公式 (1).常用数学符号 数学符号没什么特别的语法&#xff0c;这里顺道总结以下方便使用&#xff1a; &#xff0b; &#xff0d; ≠ ≈ / &#xff1e; &#xff1c; ≯ ≮ ≤ ≥ ∵ ∴ ∽ ≌&#xff0c; √&#xff0c; Φ Χ Ψ Ωα…

antd-protable的分页逻辑封装

一、前言 这次的分页基于pro-table进行封装。 前端分页看似是个小功能&#xff0c;但里面隐藏的逻辑还是非常多的&#xff0c;比如我们业务中需要的分页器除了能进行正常的页码切换等操作外&#xff0c;还需要如下的功能&#xff1a; 次页删除最后一条数据需要跳转至第一页&…

计算机研究生就业方向之去大厂做大数据

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么&#xff0c;如果你只是转码&#xff0c;那么你不一定要考研&#xff0c;至少以下几个职位研究生是没有啥优势的&#xff1a; 1&#xff0c;软件测试工程师&#xff08;培训一下就行&#xff09; 2&#xff0c;前…

JUC并发编程第十篇,谈谈ThreadLocal原理与内存泄露的那些事儿

JUC并发编程第十篇&#xff0c;谈谈ThreadLocal原理与内存泄露的那些事儿一、ThreadLocal是什么&#xff1f;能干嘛&#xff1f;二、ThreadLocal 使用场景举例三、阿里开发规范中 ThreadLocal 的使用&#xff08;SimpleDateFormat&#xff09;四、ThreadLocal 底层源码架构分析…

一个帖子教你实现 商品下单、获取商品订单信息、商品送货时发送通知 一体化功能

1、介绍 总览 通过无缝数据库结构&#xff0c;在保证数据的可用性、一致性、安全性外&#xff0c;云数据库能够实现数据在客户端和云端之间的无缝同步。云函数提供serverless环境&#xff0c;AppGallery Connect的其他服务为云函数提供事件源。监听事件源可以触发相关函数。 …

Word处理控件Aspose.Words功能演示:使用 C++ 将 PowerPoint 演示文稿转换为 Word 文档

Aspose API 支持旗下产品覆盖文档、图表、PDF、条码、OCR、CAD、HTML、电子邮件等各个文档管理领域&#xff0c;为全球.NET 、Java、C 等10余种平台开发人员提供丰富的开发选择。 在某些情况下&#xff0c;您有一个 PowerPoint 演示文稿并想要创建一个详细描述其内容的文档。为…

[附源码]Python计算机毕业设计电影院购票系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

小米手机系统好牛,真是国产系统的佼佼者

在十多年前智能手机&#xff0c;基本就没有定制、优化系统的概念&#xff0c;手机的图标都巨丑无比&#xff0c;而且还有好多不root都卸载不掉。当时买了一部漂亮国的某想手机&#xff0c;光预装应用就占了94%的空间&#xff0c;内容倒是特别“全面”&#xff0c;什么看小说的、…

“1只老母鸡”估值180亿!老乡鸡发展20年,都做对了什么?

酝酿了两年之久后&#xff0c;合肥终于迎来了养鸡IPO&#xff0c;估值180亿。 发迹于安徽、对标肯德基、麦当劳的老乡鸡餐饮股份有限公司更新了招股书&#xff0c;再度冲刺“中式快餐第一股”。 老乡鸡脱胎于2013年成立的“肥西老母鸡”&#xff0c;虽然已经走过了近二十个年头…

react源码中的生命周期和事件系统

这一章我想跟大家探讨的是React的生命周期与事件系统。 jsx的编译结果 因为前面也讲到jsx在v17中的编译结果&#xff0c;除了标签名&#xff0c;其他的挂在标签上的属性&#xff08;比如class&#xff09;&#xff0c;事件&#xff08;比如click事件&#xff09;&#xff0c;都…

《Python多人游戏项目实战》第一节 简单的方块移动

目录 1.1 设置游戏窗口 1.2 绘制一个方块 1.3 编写服务端代码 1.4 完善客户端代码 1.5 完整代码下载地址 在本节&#xff0c;我们将通过一个简单的方块移动程序进入多人联机游戏的大门。每个玩家打开游戏窗口后都可以控制一个方块&#xff0c;当某个玩移动方块后&#xff…