Java 如何检查JWT令牌是否已过期而没有抛出异常?

Java 如何检查JWT令牌是否已过期而没有抛出异常?,java,spring,string,jwt,token,Java,Spring,String,Jwt,Token,我正在开发一个Java应用程序(使用Spring Boot),我需要一些帮助: 此应用程序接收一个JWT令牌作为输入,我在一个方法中处理该令牌。目前的方法如下: private UsernamePasswordAuthenticationToken myMethod(HttpServletRequest request) { // Code that gets the 'token' String try{ Map<String, String

我正在开发一个Java应用程序(使用Spring Boot),我需要一些帮助: 此应用程序接收一个JWT令牌作为输入,我在一个方法中处理该令牌。目前的方法如下:

private UsernamePasswordAuthenticationToken myMethod(HttpServletRequest request) {
    
    // Code that gets the 'token' String

    try{
    
    Map<String, String> registry = ((Map<String, String>) (token.getBody().get("registry")));
    String sub = ((String) (parsedToken.getBody().get("sub")));


    UsernamePasswordAuthenticationToken finalToken = new UsernamePasswordAuthenticationToken(sub, null, null);
                            
            
    return finalToken; 

            
    } catch (ExpiredJwtException exception) { // Only here I have the certainty that the token has expired!
            // Code that handles the exception
    }
private UsernamePasswordAuthenticationToken myMethod(HttpServletRequest){
//获取“令牌”字符串的代码
试一试{
映射注册表=((映射)(token.getBody().get(“注册表”));
String sub=((String)(parsedToken.getBody().get(“sub”));
UsernamePasswordAuthenticationToken finalToken=新的UsernamePasswordAuthenticationToken(sub,null,null);
返回finalToken;
}catch(ExpiredJwtException异常){//只有在这里,我才能确定令牌已经过期!
//处理异常的代码
}
}

但是,我需要实现一个逻辑,该逻辑必须在几个地方检查获得的令牌是否过期,而不必每次运行此方法。我必须知道
token
是否已过期的唯一方法是
ExpiredJwtException
引发的异常

有没有办法不经过捕获的异常就知道令牌是否已过期?例如,如果有一个“token”类具有
.isExpired
属性或类似属性,那么它将非常有用


我不想去处理异常,因为这意味着每当我需要检查令牌是否过期时,我总是依赖于
try
块的(长)代码,我不希望它过期。

这可以通过使用声明来实现。下面的示例代码可以提供帮助

// Get Expiration and compare it with new Date()

public boolean isTokenExpired(String token) {
    return extractExpiration(token).before(new Date());
}


public Date extractExpiration(String token) {
    return extractClaim(token, Claims::getExpiration);
}


public <T> T extractClaim(String token , Function<Claims, T> claimResolver) {
    final Claims claim= extractAllClaims(token);
    return claimResolver.apply(claim);
}


private Claims extractAllClaims(String token) {
    return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
}
//获取到期日期并将其与新日期()进行比较
公共布尔值已过期(字符串标记){
返回有效期(令牌)。在(新日期()之前);
}
公共日期到期(字符串标记){
返回extractClaim(令牌,Claims::getExpiration);
}
公共T extractClaim(字符串标记、函数claimResolver){
最终索赔=提取所有索赔(代币);
返回索赔解决者。申请(索赔);
}
私有声明extractAllClaims(字符串标记){
返回Jwts.parser();
}

如果您使用不同的JWT库,您可以很容易地完成这项工作。具有解析和(可选)验证令牌的方法:

import com.auth0.jwt.JWT;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;


DecodedJWT jwt = JWT.decode(token);
if( jwt.getExpiresAt().before(new Date())) {
    System.out.println("token is expired");
}

我相信我已经写了所有可能的代码,使问题变得足够清楚和公平