这篇文章主要介绍了java使用JWT的方法,JWT是token的一种,一个JWT字符串包含三个部分分别是Header、Payload和Signature,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
一、简介
JWT是token的一种,一个JWT字符串包含三个部分
1.Header
头部信息,一般不需要声明,默认为 HS256 签名算法和 JWT 令牌类型
{
"alg": "HS256", // 指定签名算法
"typ": "JWT" // 指定token令牌类型
}
2.Payload
包含一些默认字段,还可以自定义一些私有字段,但是不要放敏感信息
iss: 发行人
exp: 到期时间
sub: 主题
aud: 用户
nbf: 在此之前不可用
iat: 发布时间
jti: JWT ID用于标识该JWT
3.Signature
数据签名,对上面两部分进行数据签名,Header部分和Payload部分先进行base64Url编码,然后用英文句号拼接并加上一个自定义的secret字符串盐值进行HS256对称加密【也可以用其它算法或非对称加密】
iss: 发行人
exp: 到期时间
sub: 主题
aud: 用户
nbf: 在此之前不可用
iat: 发布时间
jti: JWT ID用于标识该JWT
4.组合
最后将 Header、Payload、Signature三部分用英文句号拼接就生成了完整的JWT
Header.Payload.Signature
二、封装类
1.引入依赖
<!-- jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.3</version>
</dependency>
2.封装方法
package com.cxstar.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import java.util.Calendar;
import java.util.Map;
public class JwtUtil {
// 签名密钥
private static final String SECRET = "hello JWT *%$#$&";
/**
* 生成token
* @param payload token携带的信息
* @return token字符串
*/
public static String generateToken(Map<String,String> payload){
// 指定token过期时间
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR, 24); // 24小时
JWTCreator.Builder builder = JWT.create();
// 构建payload
payload.forEach(builder::withClaim);
// 指定过期时间和签名算法,并返回token
String token = builder.withExpiresAt(calendar.getTime()).sign(Algorithm.HMAC256(SECRET));
return token;
}
/**
* 解析token
* @param token token字符串
* @return 解析后的token类
*/
public static DecodedJWT decodeToken(String token){
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
DecodedJWT decodedJWT = jwtVerifier.verify(token);
return decodedJWT;
}
}
三、使用方法
package com.cxstar;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.cxstar.utils.JwtUtil;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashMap;
import java.util.Map;
@SpringBootTest
class JwtLoginApplicationTests {
@Test
void tokenTest() {
// 根据用户信息生成令牌 --------------------------
Map<String, String> payload = new HashMap<>();
payload.put("userId", "233");
payload.put("userName", "ps");
String token = JwtUtil.generateToken(payload);
System.out.println("token: " + token);
// --------------------------------------------
// 解析令牌并获取用户信息 ------------------------------------------------
try {
DecodedJWT decodedJWT = JwtUtil.decodeToken(token);
String userId = decodedJWT.getClaim("userId").asString();
String userName = decodedJWT.getClaim("userName").asString();
String exp = decodedJWT.getExpiresAt().toString();
System.out.println("userId: " + userId); // 取出自定义属性【用户id】
System.out.println("userName: " + userName); // 取出自定义属性【用户名】
System.out.println("exp: " + exp); // 取出默认属性【过期时间】
} catch (JWTDecodeException e) {
System.out.println("令牌错误");
} catch (TokenExpiredException e) {
System.out.println("令牌过期");
}
// -------------------------------------------------------------------
}
}
ps:最后附一篇写的很详细的JWT文章
到此这篇关于java使用JWT的文章就介绍到这了,更多相关java使用JWT内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:java使用JWT的方法
基础教程推荐
- Java实现线程插队的示例代码 2022-09-03
- Java并发编程进阶之线程控制篇 2023-03-07
- Java实现查找文件和替换文件内容 2023-04-06
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- springboot自定义starter方法及注解实例 2023-03-31
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- Java文件管理操作的知识点整理 2023-05-19
- Java数据结构之对象比较详解 2023-03-07
- java基础知识之FileInputStream流的使用 2023-08-11
- java实现多人聊天系统 2023-05-19