【问题标题】:@RestControllerAdvice doesn't handle ExpiredJwtException@RestControllerAdvice 不处理 ExpiredJwtException
【发布时间】:2021-10-31 09:41:23
【问题描述】:

我有一个非常简单的REST API in Spring Boot 2 设置,带有JWT 令牌用于授权。当令牌过期时,它会引发如下错误 -

io.jsonwebtoken.ExpiredJwtException: JWT 过期时间 2021-09-01T10:02:26Z。当前时间:2021-09-01T15:12:48Z,有所不同 18622475 毫秒。允许的时钟偏差:0 毫秒。

我捕捉到异常并尝试通过@RestControllerAdvice 处理,但看起来它没有处理。知道我在这里缺少什么吗?

private Claims extractAllClaims(String token) {
    try{
        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
    }catch (ExpiredJwtException ex){
        log.error("JWT token expired.");
        throw ex;
    }
}

ControllerAdvice -

@RestControllerAdvice
@Log4j2
public class DemoAppExceptionHandler extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers,
                                                             HttpStatus status, WebRequest request){
        log.error("Error from demo application : {} ", ex.getMessage());
        headers.setContentType(MediaType.APPLICATION_JSON);
        return super.handleExceptionInternal(ex, body, headers, status, request);
    }

    @ExceptionHandler(ExpiredJwtException.class)
    protected ResponseEntity<Object> handleExpiredJwtToken(ExpiredJwtException ex, WebRequest request){
        ErrorMessage errorMessage = ErrorMessage.builder()
                .message("Token Expired")
                .statusCode(UNAUTHORIZED.value())
                .build();
        return handleExceptionInternal(ex, errorMessage, new HttpHeaders(), UNAUTHORIZED, request);
    }
}

【问题讨论】:

  • 请参考here 并申请。让我知道它是否有效。谢谢!

标签: spring-boot jwt


【解决方案1】:

如果我没记错的话@RestControllerAdviceResponseEntityExceptionHandler 相处得不是很好。原因是@RestControllerAdvice基本上是@ControllerAdvice + @ResponseBody,这意味着方法返回值应该绑定到Web响应体。我相信当您检索 ResponseEntity 时这可能不起作用。

只有当你使用@ControllerAdvice而不使用@ResponseBody时,你才能返回ResponseEntity对象。

话虽如此,我想说以下应该有效:

@RestControllerAdvice
@Log4j2
public class DemoAppExceptionHandler {

    @ExceptionHandler(ExpiredJwtException.class)
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    public String handleExpiredJwtToken(ExpiredJwtException ex) {
        log.error("Error from people-sensing application : {} ", ex.getMessage());
        return "Token Expired";
    }
}

【讨论】:

    猜你喜欢
    • 2018-08-11
    • 1970-01-01
    • 2021-11-01
    • 2018-01-04
    • 1970-01-01
    • 2019-04-08
    • 2021-01-27
    • 2019-02-22
    • 2017-06-15
    相关资源
    最近更新 更多