{"id":1746,"date":"2023-03-26T21:21:40","date_gmt":"2023-03-26T13:21:40","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1746"},"modified":"2023-04-23T21:28:38","modified_gmt":"2023-04-23T13:28:38","slug":"spring-cloud-gateway-intercepts-input-and-output-requests","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/26\/spring-cloud-gateway-intercepts-input-and-output-requests\/","title":{"rendered":"Spring Cloud Gateway \u622a\u83b7\u8bf7\u6c42\u7684\u8f93\u5165\u8f93\u51fa"},"content":{"rendered":"<p>\u4ecb\u7ecd<code>Spring Cloud Gateway<\/code>\u622a\u83b7\u8bf7\u6c42\u7684\u8f93\u5165\u8f93\u51fa\uff0c\u4e3b\u8981\u5305\u62ec<code>Spring Cloud Gateway<\/code>\u622a\u83b7\u8bf7\u6c42\u7684\u8f93\u5165\u8f93\u51fa\u4f7f\u7528\u5b9e\u4f8b\u3001\u5e94\u7528\u6280\u5de7\u3001\u57fa\u672c\u77e5\u8bc6\u70b9\u603b\u7ed3\u548c\u9700\u8981\u6ce8\u610f\u4e8b\u9879\u3002<\/p>\n<p><!-- more --><\/p>\n<pre><code class=\"language-java\">@Component\npublic class AuthGlobalFilter implements GlobalFilter , Ordered {\n\n    @Override\n    public int getOrder(){\n        return -2;\n    }\n\n    @Override\n    public Mono&lt;Void&gt; filter(ServerWebExchange exchange, GatewayFilterChain chain) {\n\n        URI uri = exchange.getRequest().getURI();\n        try {\n            System.out.println(uri.toURL());\n        } catch (MalformedURLException e) {\n            e.printStackTrace();\n        }\n        ServerHttpRequest request= exchange.getRequest();\n        if(&quot;POST&quot;.equalsIgnoreCase(request.getMethodValue())) {\/\/\u5224\u65ad\u662f\u5426\u4e3aPOST\u8bf7\u6c42\n            Flux&lt;DataBuffer&gt; body = request.getBody();\n            AtomicReference&lt;String&gt; bodyRef = new AtomicReference&lt;&gt;();\/\/\u7f13\u5b58\u8bfb\u53d6\u7684request body\u4fe1\u606f\n            body.subscribe(dataBuffer -&gt; {\n                CharBuffer charBuffer = StandardCharsets.UTF_8.decode(dataBuffer.asByteBuffer());\n                DataBufferUtils.release(dataBuffer);\n                bodyRef.set(charBuffer.toString());\n            });\/\/\u8bfb\u53d6request body\u5230\u7f13\u5b58\n            String bodyStr = bodyRef.get();\/\/\u83b7\u53d6request body\n            System.out.println(&quot;-----------------request body start-----------------&quot;);\n            System.out.println(bodyStr);\/\/\u8fd9\u91cc\u662f\u6211\u4eec\u9700\u8981\u505a\u7684\u64cd\u4f5c\n            System.out.println(&quot;-----------------request body end-----------------&quot;);\n            DataBuffer bodyDataBuffer = stringBuffer(bodyStr);\n            Flux&lt;DataBuffer&gt; bodyFlux = Flux.just(bodyDataBuffer);\n\n            request = new ServerHttpRequestDecorator(request) {\n                @Override\n                public Flux&lt;DataBuffer&gt; getBody() {\n                    return bodyFlux;\n                }\n            };\/\/\u5c01\u88c5\u6211\u4eec\u7684request\n        }\n\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                        System.out.println(&quot;-----------------response body start-----------------&quot;);\n                        System.out.println(s);\n                        System.out.println(&quot;-----------------response body end-----------------&quot;);\n                        \/\/TODO\uff0cs\u5c31\u662fresponse\u7684\u503c\uff0c\u60f3\u4fee\u6539\u3001\u67e5\u770b\u5373\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().request(request).response(decoratedResponse).build());\n    }\n}<\/code><\/pre>\n<p>\u6ce8\u610forder\u8981\u5c0f\u4e8e<code>-1<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4ecb\u7ecdSpring Cloud Gateway\u622a\u83b7\u8bf7\u6c42\u7684\u8f93\u5165\u8f93\u51fa\uff0c\u4e3b\u8981\u5305\u62ecSpring Cloud Gatewa [&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-1746","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\/1746","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=1746"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1746\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1746"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1746"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1746"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}