{"id":1745,"date":"2023-03-26T21:20:51","date_gmt":"2023-03-26T13:20:51","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1745"},"modified":"2023-04-23T21:28:51","modified_gmt":"2023-04-23T13:28:51","slug":"obtain-spring-cloud-gateway-response-parameters-which-can-be-viewed-and-modified","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/26\/obtain-spring-cloud-gateway-response-parameters-which-can-be-viewed-and-modified\/","title":{"rendered":"\u83b7\u53d6Spring Cloud Gateway\u54cd\u5e94\u53c2\u6570\uff0c\u53ef\u4ee5\u67e5\u770b\u3001\u4fee\u6539"},"content":{"rendered":"<p>\u7f51\u5173\u53d1\u8d77\u8bf7\u6c42\u540e\uff0c\u5fae\u670d\u52a1\u8fd4\u56de\u56de\u6765\u7684Response\u503c\uff0c\u8fd8\u662f\u8981\u7ecf\u8fc7\u7f51\u5173\u624d\u53d1\u7ed9\u5ba2\u6237\u7aef\u7684\u3002\u5f88\u591a\u65f6\u5019\uff0c\u6211\u4eec\u5e0c\u671b\u80fd\u770b\u5230\u54cd\u5e94\u7684\u503c\uff0c\u6216\u8005\u4fee\u6539\u5b83\u3002<\/p>\n<p><!-- more --><\/p>\n<pre><code class=\"language-java\">import org.reactivestreams.Publisher;\nimport org.springframework.cloud.gateway.filter.GatewayFilterChain;\nimport org.springframework.cloud.gateway.filter.GlobalFilter;\nimport org.springframework.core.Ordered;\nimport org.springframework.core.io.buffer.DataBuffer;\nimport org.springframework.core.io.buffer.DataBufferFactory;\nimport org.springframework.core.io.buffer.DataBufferUtils;\nimport org.springframework.http.server.reactive.ServerHttpResponse;\nimport org.springframework.http.server.reactive.ServerHttpResponseDecorator;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.server.ServerWebExchange;\nimport reactor.core.publisher.Flux;\nimport reactor.core.publisher.Mono;\n\nimport java.nio.charset.Charset;\n\n@Component\npublic class WrapperResponseGlobalFilter implements GlobalFilter, Ordered {\n    @Override\n    public int getOrder() {\n        \/\/ -1 is response write filter, must be called before that\n        return -2;\n    }\n\n    @Override\n    public Mono&lt;Void&gt; filter(ServerWebExchange exchange, GatewayFilterChain chain) {\n        ServerHttpResponse originalResponse = exchange.getResponse();\n        DataBufferFactory bufferFactory = originalResponse.bufferFactory();\n        ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {\n            @Override\n            public Mono&lt;Void&gt; writeWith(Publisher&lt;? extends DataBuffer&gt; body) {\n                if (body instanceof Flux) {\n                    Flux&lt;? extends DataBuffer&gt; fluxBody = (Flux&lt;? extends DataBuffer&gt;) body;\n                    return super.writeWith(fluxBody.map(dataBuffer -&gt; {\n                        \/\/ probably should reuse buffers\n                        byte[] content = new byte[dataBuffer.readableByteCount()];\n                        dataBuffer.read(content);\n                        \/\/\u91ca\u653e\u6389\u5185\u5b58\n                        DataBufferUtils.release(dataBuffer);\n                        String s = new String(content, Charset.forName(&quot;UTF-8&quot;));\n                        \/\/TODO\uff0cs\u5c31\u662fresponse\u7684\u503c\uff0c\u60f3\u4fee\u6539\u3001\u67e5\u770b\u5c31\u53ef\u968f\u610f\u800c\u4e3a\n                        byte[] uppedContent = new String(content, Charset.forName(&quot;UTF-8&quot;)).getBytes();\n                        return bufferFactory.wrap(uppedContent);\n                    }));\n                }\n                \/\/ if body is not a flux. never got there.\n                return super.writeWith(body);\n            }\n        };\n        \/\/ replace response with decorator\n        return chain.filter(exchange.mutate().response(decoratedResponse).build());\n    }\n}<\/code><\/pre>\n<p>\u5c31\u662f\u5b9a\u4e49\u4e00\u4e2a<code>GlobalFilter<\/code>\uff0c\u6ce8\u610forder\u8981\u5c0f\u4e8e<code>-1<\/code>\u3002\u901a\u8fc7\u4e0a\u9762\u7684\u7c7b\uff0c\u5373\u53ef\u67e5\u770b\u670d\u52a1\u7aef\u54cd\u5e94\u7684\u503c\u3002<\/p>\n<p>\u53c2\u8003\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-gateway\/issues\/47\">https:\/\/github.com\/spring-cloud\/spring-cloud-gateway\/issues\/47<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7f51\u5173\u53d1\u8d77\u8bf7\u6c42\u540e\uff0c\u5fae\u670d\u52a1\u8fd4\u56de\u56de\u6765\u7684Response\u503c\uff0c\u8fd8\u662f\u8981\u7ecf\u8fc7\u7f51\u5173\u624d\u53d1\u7ed9\u5ba2\u6237\u7aef\u7684\u3002\u5f88\u591a\u65f6\u5019\uff0c\u6211\u4eec\u5e0c\u671b\u80fd\u770b\u5230\u54cd\u5e94 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[42],"tags":[439],"class_list":["post-1745","post","type-post","status-publish","format-standard","hentry","category-spring-cloud","tag-spring-cloud-gateway"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1745","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1745"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1745\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1745"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1745"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1745"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}