所以我们在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);
}
}