若依使用的gateway引用的pom为
其实就是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的其他都是一样的。
之前也参考了其他人的但是感觉代码量有点大,并不适合自己有兴趣的可以去看看。
发表评论