禁止未经身份验证的请求并在 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。
我有一个自定义网关过滤器工厂来检查请求是否有效或抛出异常,我有一个 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。