如何检查 JWT 令牌是否已过期而不引发异常?

wis*_*ere 10 java string spring token jwt

我正在开发一个 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
    }
Run Code Online (Sandbox Code Playgroud)

}

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

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

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

std*_*bar 26

如果您使用不同的 JWT 库,则可以轻松完成。auth0 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");
}
Run Code Online (Sandbox Code Playgroud)