当前位置: 代码网 > it编程>编程语言>Java > 基于若依Gateway中Filter的读取参数、修改请求体

基于若依Gateway中Filter的读取参数、修改请求体

2024年07月31日 Java 我要评论
其实就是cloud的一套如果在GateWay调用feign接口前面的文章已经提到过了,这里就解决如果拦截post请求下面的body信息并重新添加参数往后传。看过不少帖子有很多大佬有不不同的看法,比如若依自带就是AuthFilter中有重新修改headers的信息,既然head可以改,那body自然也可以改。因为我使用的filter不是实现GlobalFilter的大家觉得写法可能有出入其实是一样的,下面废话不多说直接贴代码。之前也参考了其他人的但是感觉代码量有点大,并不适合自己有兴趣的可以去看看。

若依使用的gateway引用的pom为

其实就是cloud的一套如果在gateway调用feign接口前面的文章已经提到过了,这里就解决如果拦截post请求下面的body信息并重新添加参数往后传。

如何使用feign接口icon-default.png?t=n7t8https://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的其他都是一样的。

之前也参考了其他人的但是感觉代码量有点大,并不适合自己有兴趣的可以去看看。

spring cloud gateway 读取、修改请求体(解决request body内容被截断)

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com