禁止未经身份验证的请求并在 spring 云网关的 http 正文中写入错误消息

Forbid unauthenticated request and write error message in http body in spring cloud gateway

我有一个自定义网关过滤器工厂来检查请求是否有效或抛出异常,我有一个 ErrorWebExceptionHandler 来处理异常。

我已经阅读了 ,并且我在我的 ErrorWebExceptionHandler 中进行了尝试:

            // error body is some Object
            exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
            exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
            String errorBodyStr = objectMapper.writeValueAsString(errorBody);
            byte[] bytes = errorBodyStr.getBytes(StandardCharsets.UTF_8);
            DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);
            return exchange.getResponse().writeWith(Mono.just(buffer)).and(exchange.getResponse().setComplete());

状态代码和内容类型正常,但响应正文为空。

不知道为什么,源码提供了一个优雅的方式。 您可以覆盖 DefaultErrorWebExceptionHandler 和 DefaultErrorAttributes,并编写您的自定义 ErrorAttributes.i 已测试它有效!

见:

org.springframework.boot.autoconfigure.web.reactive.error.AbstractErrorWebExceptionHandler#handle

添加: 所有 GlobalFilters 都将适配为 OrderedGatewayFilters。