0

所以我们在java spring boot中实现了一个拦截器中间件。目的是在任何客户端应用程序(rest api 客户端)中使用此中间件并验证所有传入的 http 请求以防止任何 CSRF 攻击。我们在我们的一个休息客户端中使用这个中间件,比如 java-demo。一切正常,除非遇到无效的 url,即不存在的端点。

   For ex: localhost:8080/java-demo/doesnotexist

在这种情况下,当拦截器逻辑引发 CSRFException 时,它不会转到我们为该特定异常定义异常处理程序的 ControllerAdvice。结果,我们在邮递员中得到状态 200,而我们应该得到 http 状态代码为 403 的异常,我们将其与响应实体一起抛出。

但是当我们点击一​​个有效的网址时,

For ex: localhost:8080/java-demo/exists

如果从拦截器逻辑引发异常,则 ControllerAdvice 捕获异常并抛出给客户端,这是预期的行为。

当 url 无效时,ControllerAdvice 无法捕获异常的可能原因是什么。

为了清楚起见:当无效的 url 被命中并且拦截器没有抛出任何异常时,我们在邮递员中得到 404 not found 错误。

csrf 中间件中存在的 ExceptionHandler 类代码

    @ControllerAdvice
public class CSRFExceptionHandler {
    @ExceptionHandler({CSRFException.class})
    public ResponseEntity<ErrorResponse> handleCSRFException(CSRFException e) {
        return new ResponseEntity<>(new ErrorResponse(e.getErrorCode(), e.getMessage()), HttpStatus.FORBIDDEN);
    }

    @ExceptionHandler({ExpectedArgNotAvailableException.class})
    public ResponseEntity<ErrorResponse> handleExpectedArgsNotAvailable(ExpectedArgNotAvailableException e) {
        return new ResponseEntity<>(new ErrorResponse(e.getErrorCode(), e.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}
4

0 回答 0