若依使用的GateWay引用的pom为
<!-- SpringCloud Gateway --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
其实就是cloud的一套如果在GateWay调用feign接口前面的文章已经提到过了,这里就解决如果拦截post请求下面的body信息并重新添加参数往后传。
如何使用feign接口https://blog.csdn.net/tao724624173/article/details/138125217看过不少帖子有很多大佬有不不同的看法,比如若依自带就是AuthFilter中有重新修改headers的信息,既然head可以改,那body自然也可以改。
因为我使用的filter不是实现GlobalFilter的大家觉得写法可能有出入其实是一样的,下面废话不多说直接贴代码。
@Component
public class DemoFilter extends AbstractGatewayFilterFactory<Object> {
private static final Logger log = LoggerFactory.getLogger(DemoFilter.class);
@Override
public GatewayFilter apply(Object config) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
//校验请求方式
if (request.getMethod() != HttpMethod.POST) {
return chain.filter(exchange);
}
String path = request.getURI().getPath();
try {
String rspStr = resolveBodyFromRequest(request);
if (rspStr == null || rspStr.trim().length() == 0) {
throw new ServiceException(ResultCode.PARAM_CANNOT_NULL);
}
//获取的body信息
JSONObject obj = JSON.parseObject(rspStr);
log.info("请求路径和参数:{},obj{}", path, JSON.toJSONString(obj));
//添加body信息
obj.put("name", "莫小邪");
//重构body
byte[] bytes = obj.toJSONString().getBytes(StandardCharsets.UTF_8);
DataBuffer bodyDataBuffer = stringToDataBuffer(bytes);
Flux<DataBuffer> bodyFlux = Flux.just(bodyDataBuffer);
// 重构header
ServerHttpRequest newRequest = request.mutate().build();
HttpHeaders newHeaders = new HttpHeaders();
newHeaders.putAll(exchange.getRequest().getHeaders());
//新增heads
newHeaders.put("AK", Arrays.asList("123456"));
newRequest = new ServerHttpRequestDecorator(newRequest) {
@Override
public HttpHeaders getHeaders() {
return newHeaders;
}
@Override
public Flux<DataBuffer> getBody() {
return bodyFlux;
}
};
return chain.filter(exchange.mutate().request(newRequest).build());
} catch (Exception e) {
if (e.getCause() instanceof ServiceException) {
ServiceException se = (ServiceException) e.getCause();
return unauthorizedResponse(exchange, se.getMessage());
}
log.error("[鉴权异常处理]请求路径:{},msg:{}", exchange.getRequest().getPath(), e.getMessage());
return unauthorizedResponse(exchange, ResultCode.AUTHENTICATION_REQUEST_FAILED.getMessage());
}
};
}
private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) {
// 获取请求体
Flux<DataBuffer> body = serverHttpRequest.getBody();
AtomicReference<String> bodyRef = new AtomicReference<>();
body.subscribe(buffer -> {
CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer());
DataBufferUtils.release(buffer);
bodyRef.set(charBuffer.toString());
});
return bodyRef.get();
}
private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) {
log.error("[鉴权异常处理]请求路径:{}", exchange.getRequest().getPath());
return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.UNAUTHORIZED);
}
private DataBuffer stringToDataBuffer(byte[] bytes) {
NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length);
buffer.write(bytes);
return buffer;
}
}
其实这段中主要是这段重构body和head的其他都是一样的。
之前也参考了其他人的但是感觉代码量有点大,并不适合自己有兴趣的可以去看看。