Jwts.builder() .setId(String.valueOf(userId)) .setSubject(username) .setIssuedAt(now) .setExpiration(expiration) .signWith(SignatureAlgorithm.HS512, SECRET_KEY) .compact();与Jwts.builder() .addClaims(claims) .signWith(SignatureAlgorithm.HS256, signKey) .setExpiration(new Date(System.currentTimeMillis() + expire)) .compact();含义与区别
时间: 2024-02-14 18:36:00 浏览: 149
这两种方式都是使用 JWT Builder 来构建 JWT Token 的方法,但是它们的具体实现和使用场景略有不同。
第一种方式使用了 setId()、setSubject()、setIssuedAt() 和 setExpiration() 方法来设置 JWT 的一些标准声明(Standard Claims),同时使用 signWith() 方法来指定 JWT 签名算法和密钥。常见的标准声明包括 JWT 的唯一标识符、主题、签发时间和过期时间等,这些声明可以被接收 JWT 的各方验证和使用。这种方式适用于标准的 JWT Token 需要包含的信息比较简单的情况。
第二种方式使用了 addClaims() 方法来添加 JWT Token 的一些声明,可以自定义一些声明,同时使用 signWith() 方法来指定 JWT 签名算法和密钥,使用 setExpiration() 方法来设置 JWT 过期时间。这种方式适用于需要自定义一些声明的情况,比如需要添加用户角色、权限等信息。
另外,第一种方式使用了 HS512 算法进行签名,密钥为 SECRET_KEY,而第二种方式使用了 HS256 算法进行签名,密钥为 signKey,这两种算法的安全性略有不同,HS512 相对于 HS256 更加安全,但是也会造成一定的性能损失。
总之,选择使用哪一种方式,需要根据具体的使用场景和需求来决定。
相关问题
Jwts.builder().claim
JWT(JSON Web Tokens)是一种开放标准的安全令牌协议,常用于身份验证和授权。在使用JWTS(Java JWT)库构建JWT时,`.builder()`方法是一个静态工厂方法,它返回一个`JwtBuilder`对象,可以用来构造JWT的各个部分。
`.claim()`方法是`JwtBuilder`的一部分,用于添加声明(claims)到JWT头(header)或有效载荷(payload)。声明是一组键值对,它们包含了关于用户信息、权限或其他应用特定的数据。常见的claim有:
- `sub`: 用户标识(subject)
- `iat`: 签发时间(issued at)
- `exp`: 过期时间(expiration time)
- `aud`: 接受者(audience)
- `scope`: 权限范围
例如,以下代码展示了如何添加一些基本的claim:
```java
String secret = "your-secret-key";
Map<String, Object> claims = new HashMap<>();
claims.put("username", "john.doe");
claims.put("email", "john.doe@example.com");
Jwt签发者 builder = Jwts.builder()
.setClaims(claims)
.setSubject(claims.get("username"))
.signWith(SignatureAlgorithm.HS512, secret);
String jwt = builder.compact();
```
return Jwts.builder() .setId(UUID.randomUUID().toString()) .setIssuedAt(new Date(currentTime)) //签发时间 .setSubject("system") //说明 .setIssuer("heima") //签发者信息 .setAudience("app") //接收用户 .compressWith(CompressionCodecs.GZIP) //数据压缩方式 .signWith(SignatureAlgorithm.HS512, generalKey()) //加密方式 .setExpiration(new Date(currentTime + 3_600 * 1000)) //过期时间戳 .addClaims(claimMaps) //cla信息 .compact();这段代码中3_600是什么意思,为什么要这样写,有什么好处
这段代码中的3_600是一个时间戳,表示以秒为单位的3600秒,也就是1小时。这段代码的作用是设置token的过期时间为1小时,过期后需要重新获取token才能进行操作。这样可以增加系统的安全性,防止token被长时间滥用。将时间戳写成3_600的形式是为了增加代码的可读性,方便开发者快速理解代码的意图。
阅读全文