JWT令牌

devtools/2024/9/22 21:45:27/

 jwt令牌的组成

1.Header:记录令牌类型,签名算法等,例如:{"alg":"HS256","type":"JWT"}

2.Payload(有效载荷),携带一些自定义信息,默认信息等,例如:{"id":"1","username":"Tom"}

3.Signature(签名):防止Token被篡改,确保安全性,将Header,Payload一并加入指定秘钥中,通过指定签名算法计算而来.

引入依赖

第一种

在这个版本中对签名长度有了一定的要求,必须要达到256个字节,如果你不想使用这么长的签名的话,可以使用第二种

        <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.5</version></dependency><!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.5</version><scope>runtime</scope></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-gson</artifactId><version>0.11.5</version></dependency>

 第二种

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>

第二种不会爆长度错误 

生成jwt令牌

传递的参数,签名,有效时间,携带的信息

1.签名算法用SignatureAlgorithm指定

2.有效荷载使用Map<String,Object>claim

3.指定签名字符串

java">/*** 生成jwt* 使用Hs256算法, 私匙使用固定秘钥** @param secretKey jwt秘钥* @param ttlMillis jwt过期时间(毫秒)* @param claims    设置的信息* @return*/public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {// 指定签名的时候使用的签名算法,也就是header那部分SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;// 生成JWT的时间long expMillis = System.currentTimeMillis() + ttlMillis;Date exp = new Date(expMillis);// 设置jwt的bodyJwtBuilder builder = Jwts.builder()// 如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的.setClaims(claims)// 设置签名使用的签名算法和签名使用的秘钥.signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))// 设置过期时间.setExpiration(exp);return builder.compact();}

接下来是一个固定的格式使用builder中的setClaims或者addClaims添加信息,使用signWith传入连个参数,第一个是设置签名算法,第二个是设置秘钥.然后是过期时间.最后调用compact方法用于将builder转换成一个紧凑的字符串

解析jwt令牌

java">    public static Claims parseJWT(String secretKey, String token) {// 得到DefaultJwtParserClaims claims = Jwts.parser()// 设置签名的秘钥.setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))// 设置需要解析的jwt.parseClaimsJws(token).getBody();return claims;}

传入秘钥和令牌就可以获得信息.

在苍穹外卖里整体流程是这样的

首先将一些固定信息定义在application.yml里

sky:jwt:# 设置jwt签名加密时使用的秘钥admin-secret-key: itcast# 设置jwt过期时间admin-ttl: 7200000# 设置前端传递过来的令牌名称admin-token-name: token

然后定义一个Jwtproperties类

java">@Component
@ConfigurationProperties(prefix = "sky.jwt")
@Data
public class JwtProperties {/*** 管理端员工生成jwt令牌相关配置*/private String adminSecretKey;private long adminTtl;private String adminTokenName;}

@ConfigurationProperties(prefix = "sky.jwt")使用这个注解自动映射要注意变量名得是属性名去掉了"-"后的驼峰命名.

然后创建并使用

@Autowired
private JwtProperties jwtProperties;
java">String token = JwtUtil.createJWT(
jwtProperties.getAdminSecretKey(),
jwtProperties.getAdminTtl(),
claims);


http://www.ppmy.cn/devtools/35545.html

相关文章

Redis学习(七)|如何保证Redis中的数据都是热点数据

文章目录 题目分析回答扩展Spring Boot中时用LRU管理Redisapplication.propertiesapplication.yml Redis 缓存策略 题目 MySQL里有2000w数据&#xff0c;redis中只存20w的数据&#xff0c;如何保证redis中的数据都是热点数据? 分析 这个问题涉及到在一个数据量差异很大的情…

图片四张的时候两个一排 图片三张 五张的时候三个一排 css 如何实现

实现的效果如下图 1、html <view v-if"item.photo_list && item.photo_list.length ! 0" :class"getImageClass(item.photo_list.length)"><view v-for"(j,ind) in item.photo_list" :key"photoind" class"imag…

13 【PS作图】人物绘画理论-脸型

三庭五眼 三庭&#xff1a;脸的长度比例 &#xff08;1&#xff09;发际线到眉毛 &#xff08;2&#xff09;眉毛到鼻底 &#xff08;3&#xff09;鼻底到下巴 三个部分大致为三等分 五眼&#xff1a;脸的宽度比例 以眼睛长度为单位&#xff0c;把脸的宽度分成五等分&#x…

【高校科研前沿】中国科学院地理资源所钟帅副研究员研究组博士生朱屹东为一作在Top期刊发文:从潜力到利用:探索西藏风能资源开发的技术路径优化布局

01 文章简介 论文名称&#xff1a;From potential to utilization: Exploring the optimal layout with the technical path of wind resource development in Tibet&#xff08;从潜力到利用:探索西藏风能资源开发的技术路径优化布局&#xff09; 文章发表期刊&#xff1a;《…

【力扣】203、环形链表 II

142. 环形链表 II 要解决这道题&#xff0c;首先需要对问题进行拆解&#xff1a; 确定链表是否存在环确定环的入口点 如何判断是否存在环呢&#xff1f;这个比较容易想到&#xff0c;使用快慢指针即可判断链表是否存在环。我们定义两个指针&#xff1a; ListNode slow head…

PROXY代理学习

代理&#xff08;PROXY&#xff09;学习 在计算机领域中&#xff0c;代理&#xff08;Proxy&#xff09;是一种特殊的网络服务&#xff0c;它充当客户端和服务器之间的中介&#xff0c;使得客户端能够通过代理与另一台服务器进行通信。代理服务可以用于多种目的&#xff0c;包括…

纯血鸿蒙APP实战开发——页面间共享组件实例的案例

介绍 本示例提供组件实例在页面间共享的解决方案&#xff1a;通过Stack容器&#xff0c;下层放地图组件&#xff0c;上层放Navigation组件来管理页面&#xff0c;页面可以共享下层的地图组件&#xff0c;页面中需要显示地图的区域设置为透明&#xff0c;并参考触摸交互控制&am…

Python tutorial 2.7.13第四章(深入 Python 流程控制)

4. 深入 Python 流程控制 除了前面介绍的 while 语句&#xff0c;Python 还从其它语言借鉴了一些流程控制功能&#xff0c;并有所改变。 4.1. if 语句 也许最有名的是 if 语句。例如: >>> x int(raw_input("Please enter an integer: ")) Please enter…