zoukankan      html  css  js  c++  java
  • 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());
        }
    }
  • 相关阅读:
    Python with语句和过程抽取思想
    HTML DOM 学习
    暴力破解( Hydra | Medusa)
    CSRF漏洞原理浅谈
    文件包含漏洞原理浅探
    JavaScript BOM学习
    PHP命令执行漏洞初探
    一段思考
    文件上传解析漏洞
    谈谈Javascript的this关键字(this is not this)
  • 原文地址:https://www.cnblogs.com/zhian/p/15143600.html
Copyright © 2011-2022 走看看