使用jjwt库,

 String compactJws = Jwts.builder().setSubject("Joe").signWith(SignatureAlgorithm.HS512, key).compact();

但是这个令牌是永久的,我该如何对此设置超时呢?

最佳答案

Date expiration = getExpirationDate(); // implement me

Jwts.builder().setSubject("Joe")
    .setExpiration(expiration)
    .signWith(SignatureAlgorithm.HS512, key)
    .compact();

根据JWT规范,日期将转换为自纪元以来的秒数(而不是毫秒),并存储为JWT声明的exp。解析器将查看该声明,并确保JWT不过期。

请注意,到期检查基于解析时的系统时钟时间。如果与解析令牌的计算机相比,生成令牌的计算机的时钟漂移合理,则到期检查可能会失败。在这种情况下,您可以使用JJWT的setAllowedClockSkewSeconds方法(在JwtParser / Builder上)为时钟之间的差异留出一些摆动空间(1至2分钟应该足够),例如:
Jwts.parser().setAllowedClockSkewSeconds(120)...etc...

如果由于某种原因可能还不够好,您可以通过以下方式控制实际的解析时钟:
Jwts.parser().setClock(new MyClock())...etc...

在大多数情况下,不需要设置Clock(通常在测试用例中最有用)。

08-19 22:21