首页 > 其他 > 详细

Gateway获取post请求参数

时间:2021-03-30 20:34:31      阅读:543      评论:0      收藏:0      [点我收藏+]
import com.live.gateway.IpUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.factory.rewrite.CachedBodyOutputMessage;
import org.springframework.cloud.gateway.support.BodyInserterContext;
import org.springframework.cloud.gateway.support.DefaultServerRequest;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserter;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;


/**
* @author wjc
* @description
*/
@Component
@Slf4j
public class LogFilter implements GlobalFilter, GatewayFilter, Ordered {


    private static final String REQUESTID = "traceId";


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String bodyStr = "";
        String method = request.getMethodValue();
        String uri = request.getPath().toString();
        //判断是否为POST请求
        if (HttpMethod.POST.name().equalsIgnoreCase(method) ) {
            ServerRequest serverRequest = new DefaultServerRequest(exchange);
            // 读取请求体
            if(uri.equals("/my/editorImgUrl") || uri.equals("/base/uploadImage")) {
                return chain.filter(exchange.mutate().build());
            }
            Mono<String> modifiedBody = serverRequest.bodyToMono(String.class)
                    .flatMap(body -> {
                        //记录请求体日志
                        saveRequestOperLog(exchange, body);
                        return Mono.just(body);
                    });


            BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class);
            HttpHeaders headers = new HttpHeaders();
            headers.putAll(exchange.getRequest().getHeaders());
            headers.remove(HttpHeaders.CONTENT_LENGTH);


            CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers);
            return bodyInserter.insert(outputMessage, new BodyInserterContext())
                    .then(Mono.defer(() -> {
                        ServerHttpRequestDecorator decorator = new ServerHttpRequestDecorator(
                                exchange.getRequest()) {
                            @Override
                            public HttpHeaders getHeaders() {
                                long contentLength = headers.getContentLength();
                                HttpHeaders httpHeaders = new HttpHeaders();
                                httpHeaders.putAll(super.getHeaders());
                                if (contentLength > 0) {
                                    httpHeaders.setContentLength(contentLength);
                                } else {
                                    httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
                                }
                                return httpHeaders;
                            }


                            @Override
                            public Flux<DataBuffer> getBody() {
                                return outputMessage.getBody();
                            }
                        };


                        return chain.filter(exchange.mutate().request(decorator).build());
                    }));
        }
        if (HttpMethod.GET.name().equalsIgnoreCase(method)) {
            bodyStr = request.getQueryParams().toString();
            String nId = saveRequestOperLog(exchange, bodyStr);
            ServerHttpRequest userInfo = exchange.getRequest().mutate()
                    .header(REQUESTID, nId).build();
            return chain.filter(exchange.mutate().request(userInfo).build());
        }


        return chain.filter(exchange);
    }




    /**
     * 保存请求日志
     *
     * @param exchange
     * @param requestParameters
     * @return
     */
    private String saveRequestOperLog(ServerWebExchange exchange, String requestParameters) {
        requestParameters = requestParameters.replaceAll("\r\n","");
        ServerHttpRequest request = exchange.getRequest();


        String ip = IpUtils.getIp(exchange);
        String uri = request.getURI().toString();
        String query = request.getURI().getRawQuery();
        String url = request.getPath().toString();
        String method = request.getMethodValue();
        log.info(String.format("\nURI: %s \nURL: %s \nMETHOD: %s \nQUERY: %s \nBODY: %s \nIP: %s", url, uri, method, query, requestParameters, ip));
        return requestParameters;
    }


    @Override
    public int getOrder() {
        return 5;
    }
}

 

Gateway获取post请求参数

原文:https://www.cnblogs.com/gqymy/p/14597464.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!