处理JWT SignatureException的最佳方法

问题描述

当客户端向我的服务器发送无效令牌时,服务器将返回500状态代码。我认为这很丑。 400(错误请求)代码会更正确吗? 如果400码更正确,那么如何处理500错误?我试图捕获SignatureException并抛出ResponseStatusException,但随后收到如下响应:

{
    "timestamp": "2020-10-17T09:34:26.939+00:00","status": 500,"error": "Internal Server Error","message": "400 BAD_REQUEST \"cause: token is invalid\"","path": "/toucan/user/delete"
}

我指定的消息和状态代码错误消息中,代码为500。有没有办法在没有500的情况下抛出400状态?

解决方法

首先,让我们谈谈状态码。
如果发送的令牌无效,则用户无权使用状态代码为401的API。
然后让我们讨论一下如何在Spring中拦截您的异常。您应该检查official documentation并在@ResponseStatus(value=HttpStatus.UNAUTHORIZED,reason="Invalid Token")类上使用SignatureException(或捕获它并使用注释添加自定义Exception)。
要么实现@ControllerAdvice来通过带有以下注释的方法来处理异常:@ExceptionHandler(value = SignatureException.class)
文档中都提到了这两种解决方案。