利用Java进行jwt的生成和解析

//引入依赖
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.0</version>
</dependency>
public class JwtUtil {
	// token秘钥  
	public static String SECRET = "djkahfkjhdlkajjdwajdjajwdjdlawjjdwj";

	/**
	 * 生成Jwt的方法
	 * @param id  用户ID
	 * @param map  需要加密的数据,可以替换成json或者其他类型
	 * @return Token String 凭证
	 */
	public static String createJWT(String id,Map map) {
		//设置过期时间
		long ttlMillis=96 * 60 * 60 * 1000;//4天
		// 签名方法 HS256
		SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

		// 生成Jwt的时间
		long nowMillis = System.currentTimeMillis();
		Date now = new Date(nowMillis);

		// 生成秘钥
		byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET);
		Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());

		// 设置JWT所存储的信息
		JwtBuilder builder = Jwts.builder().setId(id).setIssuedAt(now).signWith(signatureAlgorithm,signingKey);

		builder.claim("name", map); //存储自定义信息

		// 设置过期时间
		if (ttlMillis >= 0) {
			long expMillis = nowMillis + ttlMillis;
			Date exp = new Date(expMillis);
			builder.setExpiration(exp);
		}

		// 构建JWT并将其序列化为紧凑的URL安全字符串
		return builder.compact();
	}

	/**
	 * 解析Jwt字符串
	 *
	 * @param jwt Jwt字符串
	 * @return Claims 解析后的对象
	 */
	public static Claims parseJWT(String jwt) {
		return Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(SECRET)).parseClaimsJws(jwt).getBody();
	}

	/**
	 * 验证JWT(解析时候调用)
	 *
	 * @param jwtStr jwt字符串
	 * @return JOSNObject 解析结果<br/>      
	 */
	public static JSONObject validateJWT(String jwtStr) {
		JSONObject pojo = new JSONObject();
		Claims claims = null;
		try {
			claims = parseJWT(jwtStr);
			pojo.put("Success", true);
			pojo.put("Claims", claims);
		} /*catch (ExpiredJwtException e) {
			pojo.put("Success", false);
			pojo.put("ErrCode", 1005);
			e.printStackTrace();
		} */catch (Exception e) {
			pojo.put("Success", false);
			pojo.put("ErrCode", 1004);
			e.printStackTrace();
		}
		return pojo;
	}
JWT(JSON Web Token)是一种用于身份验证和授权的开放标准,可以在应用程序和服务之间安全地传输声明。下面是使用Java编写JWT生成器和解析器的示例代码。 首先,你需要使用Maven或Gradle添加以下依赖项: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> ``` 然后,你可以使用以下代码生成JWT: ```java import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; public class JwtGenerator { private static final String SECRET_KEY = "your-secret-key"; // 你的密钥 public static String generateJwt(String subject, long ttlMillis) { // 设置签名算法和密钥 SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; byte[] apiKeySecretBytes = SECRET_KEY.getBytes(); Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); // 设置过期时间 long nowMillis = System.currentTimeMillis(); Date now = new Date(nowMillis); Date expiration = new Date(nowMillis + ttlMillis); // 创建JWT JwtBuilder builder = Jwts.builder() .setIssuedAt(now) .setSubject(subject) .setExpiration(expiration) .signWith(signatureAlgorithm, signingKey); // 返回JWT return builder.compact(); } } ``` 在上面的代码中,`generateJwt`方法接受一个主题和一个时间戳(以毫秒为单位),并返回一个JWT字符串。使用`setIssuedAt`方法设置JWT的发行时间,使用`setSubject`方法设置JWT的主题,使用`setExpiration`方法设置JWT的过期时间,并使用`signWith`方法设置签名算法和密钥。 接下来,你可以使用以下代码解析JWT: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; public class JwtParser { private static final String SECRET_KEY = "your-secret-key"; // 你的密钥 public static String parseJwt(String jwt) { // 解析JWT Claims claims = Jwts.parser() .setSigningKey(SECRET_KEY.getBytes()) .parseClaimsJws(jwt) .getBody(); // 返回JWT主题 return claims.getSubject(); } } ``` 在上面的代码中,`parseJwt`方法接受一个JWT字符串,并返回JWT的主题。使用`setSigningKey`方法设置解析JWT时使用的密钥,并使用`parseClaimsJws`方法解析JWT。最后,使用`getBody`方法获取JWT的声明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值