写了一个jwt的类,但是没有达到网页上的效果

package com.test.jwt;

import java.io.UnsupportedEncodingException;
import java.security.Key;
import java.util.Base64;
import java.util.Date;

import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;

import org.junit.Test;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public class JwtHelper {
	
	//Token过期时间
	private final static int expiresSecond = 172800000;

	/*
	 * 把秘钥转成base64格式
	 */
	@Test
	public static String base64for(String keyText) throws UnsupportedEncodingException {
		final Base64.Decoder decoder = Base64.getDecoder();
		final Base64.Encoder encoder = Base64.getEncoder();

		final byte[] keyByte = keyText.getBytes("UTF-8"); // base64Secret.getBytes("UTF-8");
		// 编码
		final String encodedKey = encoder.encodeToString(keyByte);

		//System.out.println("加密后秘钥  " + encodedKey);
		// 解base64码
		//System.out.println("解密后秘钥  " + new String(decoder.decode(encodedKey), "UTF-8"));

		return encodedKey;
	}

	// 根据秘钥,解密jwt加密内容,转成实体Claim,就可以从Claim中取出内容。Claims实际上是个Map
	public static Claims parseJWT(String jsonWebToken, String encodedKey) {
		try {
			Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(encodedKey))
					.parseClaimsJws(jsonWebToken).getBody();
			return claims;
		} catch (Exception ex) {
			ex.printStackTrace();
			return null;
		}
	}

	/*
	 *根据秘钥以及设置的内容,建立 jwt字符串
	 */
	public static String createJWT(String sub, String name, String orgnization,String role[],
			String scope[], String iat,String encodedKey) {
		SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

		long nowMillis = System.currentTimeMillis();
		Date now = new Date(nowMillis);

		// 生成签名密钥
		byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(encodedKey);
		Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());

		// 设置要添加的参数"alg": "HS256",
		JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT").setHeaderParam("alg", "HS256")
				.claim("sub", sub)
				.claim("name", name)
				.claim("orgnization", orgnization)
				.claim("role", role)
				.claim("scope", scope)	
				.claim("iat", iat)
				.signWith(signatureAlgorithm, signingKey);
		
		// 添加Token过期时间
		if (expiresSecond >= 0) {
			long expMillis = nowMillis + expiresSecond;
			Date exp = new Date(expMillis);
			builder.setExpiration(exp).setNotBefore(now);
		}

		// 生成JWT字符串
		return builder.compact();
	}

	public static void main(String[] args) throws UnsupportedEncodingException {
		
		String myKey =base64for("abc");
 
		String[] role= {"user","contributor","admin"};
		String[] scope= {"mine","orgnization","platform"};
		String iat="1516239022";
		
		String jwt = createJWT("9123657", "张三", "XX信息中心", role,scope,iat,myKey);
		System.out.println("jwt加密后的   " + jwt);

		String jwtString = jwt;
		Claims cla = parseJWT(jwtString, myKey);//Claims实际上是个Map

		
		//下面是取出来的内容
		System.out.println(cla.get("sub"));
		System.out.println(cla.get("name"));
		System.out.println(cla.get("orgnization"));
		System.out.println(cla.get("role"));
		System.out.println(cla.get("scope"));
		System.out.println(cla.get("iat"));
		
	}

}

 写个一个jwt的demo ,然而和https://jwt.io/上的效果不太一样,先忙别的了,对jwt了解还是不深

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当涉及到JWT(JSON Web Token)的处理,Java中有一些库可以使用,例如 JJWT 和 Nimbus-JOSE-JWT。下面是一个简单的示例,使用 JJWT 库实现 JWT 的生成和解析的 Java 工具: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; import java.util.HashMap; import java.util.Map; public class JwtUtils { private static final String SECRET_KEY = "your_secret_key"; private static final long EXPIRATION_TIME = 86400000; // 24 hours public static String generateToken(String subject) { Date now = new Date(); Date expiration = new Date(now.getTime() + EXPIRATION_TIME); Map<String, Object> claims = new HashMap<>(); claims.put("sub", subject); return Jwts.builder() .setClaims(claims) .setIssuedAt(now) .setExpiration(expiration) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } public static String getSubjectFromToken(String token) { Claims claims = Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody(); return claims.getSubject(); } } ``` 使用时,可以调用 `generateToken` 方法生成一个 JWT,并将其传递给客户端。在需要验证和解析 JWT 的地方,可以调用 `getSubjectFromToken` 方法提取出 JWT 中的 subject(主题)信息。 请注意,上述示例中的 `SECRET_KEY` 是用于签名和验证 JWT 的密钥,应该保持安全并且不能泄露。另外,`EXPIRATION_TIME` 是 JWT 的过期时间,可以根据自己的需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值