• java geteway 手机返回数据


    import lombok.extern.slf4j.Slf4j;
    import org.reactivestreams.Publisher;
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.cloud.gateway.filter.GlobalFilter;
    import org.springframework.core.Ordered;
    import org.springframework.core.io.buffer.DataBuffer;
    import org.springframework.core.io.buffer.DataBufferFactory;
    import org.springframework.core.io.buffer.DataBufferUtils;
    import org.springframework.http.HttpMethod;
    import org.springframework.http.MediaType;
    import org.springframework.http.server.reactive.ServerHttpRequest;
    import org.springframework.http.server.reactive.ServerHttpResponse;
    import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import reactor.core.publisher.Flux;
    import reactor.core.publisher.Mono;
    
    import java.nio.charset.Charset;
    
    @Component
    @Slf4j
    public class HttpResponseGlobalFilter implements GlobalFilter, Ordered {
        @Override
        public int getOrder() {
            return -2;
        }
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            ServerHttpRequest serverHttpRequest = exchange.getRequest();
            ServerHttpResponse originalResponse = exchange.getResponse();
            String contentType = originalResponse.getHeaders().getFirst("Content-Type");
            if(contentType==null||!contentType.equals(MediaType.APPLICATION_JSON_VALUE)){
               return chain.filter(exchange);
            }
    
            //如果是post请求,将请求体取出来,再写入
            HttpMethod method = serverHttpRequest.getMethod();
            long contentLength = originalResponse.getHeaders().getContentLength();
            //当返回体里面没有任何数据的话不用后面的获取数据步骤
            if(contentLength<1){
                return chain.filter(exchange);
            }
            DataBufferFactory bufferFactory = originalResponse.bufferFactory();
            ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
                @Override
                public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
                    if (body instanceof Flux) {
                        Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
                        return super.writeWith(fluxBody.buffer().map(dataBuffers -> {//解决返回体分段传输
                            StringBuffer stringBuffer = new StringBuffer();
                            dataBuffers.forEach(dataBuffer -> {
                                byte[] content = new byte[dataBuffer.readableByteCount()];
                                dataBuffer.read(content);
                                DataBufferUtils.release(dataBuffer);
                                try {
                                    stringBuffer.append(new String(content, "utf-8"));
                                } catch (Exception e) {
                                    log.error("--list.add--error", e);
                                }
                            });
                            String result = stringBuffer.toString();
                            //TODO,result就是response的值,想修改、查看就随意而为了
                            String url = serverHttpRequest.getPath().toString();
                            String urlParams = serverHttpRequest.getQueryParams().toSingleValueMap().toString();
                            String accessId = "";
                            if( serverHttpRequest.getHeaders()!=null){
                                accessId= serverHttpRequest.getHeaders().getFirst("accessId");
                            }
    
                            //log.info("请求长度:" + StringUtils.length(requestBodyStr) + ",返回data长度:" + StringUtils.length(jsonObject.getString("data")));
                            //log.info("请求地址:【{}】请求参数:GET【{}】|POST:【
    {}
    】,响应数据:【
    {}
    】", url, urlParams, result);
                            log.info("
    " + "-------------------------------------------------------------------------------->>
    " +
                                            "locationtype: response
    " +
                                            "Url        : {}
    " +
                                            "HttpMethod : {}
    " +
                                            "accessId: {}
    " +
                                            "Param      : {}
    " +
                                            ""<<--------------------------------------------------------------------------------"
                                    ,url, method, accessId,result);
                            byte[] uppedContent = new String(result.getBytes(), Charset.forName("UTF-8")).getBytes();
                            originalResponse.getHeaders().setContentLength(uppedContent.length);
                            return bufferFactory.wrap(uppedContent);
                        }));
                    }
                    // if body is not a flux. never got there.
                    return super.writeWith(body);
                }
            };
            // replace response with decorator
            return chain.filter(exchange.mutate().response(decoratedResponse).build());
        }
    }
  • 相关阅读:
    Kubernetes 多租户:Pod 安全策略
    程序员是怎样的人
    AES加解密(golang <> cryptojs)
    matplotlib可视化系列之【缩放和投影】
    mac系统 hhkb切换搜狗中英文输入法方法
    java 多线程 带返回值与不带返回值
    linux /etc/fstab 文件详细说明(转)
    Pythonspyder设置python版本
    C++std::iota
    python使用lxml的xpath解析xml
  • 原文地址:https://www.cnblogs.com/zhian/p/15143600.html
Copyright © 2020-2023  润新知