java使用JWT的方法
一、简介
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文章https://www.jb51.net/article/250529.htm
到此这篇关于java使用JWT的文章就介绍到这了,更多相关java使用JWT内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java程序开发中abstract 和 interface的区别详解
abstract class和interface在Java语言中都是用来进行抽象类。但是两者有什么区别呢,接下来小编给大家带来了abstract 和 interface的区别详解,感兴趣的朋友一起学习吧2016-06-06SpringMVC结合ajaxfileupload.js实现文件无刷新上传
这篇文章主要介绍了SpringMVC结合ajaxfileupload.js实现文件无刷新上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2016-10-10因Spring AOP导致@Autowired依赖注入失败的解决方法
这篇文章主要给大家介绍了因Spring AOP导致@Autowired依赖注入失败的解决方法,文中通过示例代码给大家介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。2017-07-07Java通过调用C/C++实现的DLL动态库——JNI的方法
这篇文章主要介绍了Java通过调用C/C++实现的DLL动态库——JNI的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下2018-01-01
最新评论