国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

springcloud的gateway之GlobalFilter獲取請求信息及requestBody

這篇具有很好參考價值的文章主要介紹了springcloud的gateway之GlobalFilter獲取請求信息及requestBody。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

《本文參考地址》

分開寫法

RequestGlobalFilter.java

package com.makeit.filter;
 
import lombok.extern.slf4j.Slf4j;


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.DataBufferUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
 
import java.net.URI;
import java.nio.charset.StandardCharsets;
 
/**
 * RequestFilter
 */
@Component
@Slf4j
public class RequestGlobalFilter implements GlobalFilter, Ordered {
 
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        URI URIPath = request.getURI();
        String path = request.getPath().value();
        String method = request.getMethodValue();
        HttpHeaders header = request.getHeaders();
        String requestParams = String.valueOf(request.getQueryParams());
        log.info("***********************************請求信息**********************************");
        log.info("URI = {}", URIPath);
        log.info("path = {}", path);
        log.info("header = {}", header);
        log.info("params = {}", requestParams);
 
 		//文件上傳不做處理
        String contentType = header.getFirst("content-type");
        if (StringUtils.hasLength(contentType) && contentType.contains("multipart/form-data")) {
            return chain.filter(exchange);
        }
 
 		//獲取requestBody
        if (header.getContentLength() > 0) {
            return DataBufferUtils.join(exchange.getRequest().getBody()).flatMap(dataBuffer -> {
                        byte[] bytes = new byte[dataBuffer.readableByteCount()];
                        dataBuffer.read(bytes);
                        String bodyString = new String(bytes, StandardCharsets.UTF_8);
                        log.info("requestBody = {}", bodyString);
                        exchange.getAttributes().put("POST_BODY", bodyString);
                        DataBufferUtils.release(dataBuffer);
                        Flux<DataBuffer> cachedFlux = Flux.defer(() -> Mono.just(exchange.getResponse().bufferFactory().wrap(bytes)));
 
                        ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) {
                            @Override
                            public Flux<DataBuffer> getBody() {
                                return cachedFlux;
                            }
                        };
                        log.info("****************************************************************************\n");
                        return chain.filter(exchange.mutate().request(mutatedRequest).build());
                    });
        }
        log.info("****************************************************************************\n");
        return chain.filter(exchange);
    }
 
    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

ResponseGlobalFilter.java

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.core.io.buffer.DefaultDataBufferFactory;
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.StandardCharsets;

/**
 * ResponseFilter
 */
@Slf4j
@Component
public class ResponseGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //獲取response的 返回數(shù)據(jù)
        ServerHttpRequest originalRequest = exchange.getRequest();
        ServerHttpResponse originalResponse = exchange.getResponse();
        DataBufferFactory bufferFactory = originalResponse.bufferFactory();

        ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
            @Override
            public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
                Flux<? extends DataBuffer> fluxBody = Flux.from(body);
                body = fluxBody.buffer().map(dataBuffers -> {
                    DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
                    DataBuffer join = dataBufferFactory.join(dataBuffers);
                    byte[] content = new byte[join.readableByteCount()];
                    join.read(content);
                    String responseData = new String(content, StandardCharsets.UTF_8);
                    log.info("***********************************響應信息**********************************");
//                    log.info("請求內(nèi)容:{}", originalRequest);
                    log.info("響應內(nèi)容:{}", responseData);
                    log.info("****************************************************************************\n");
                    DataBufferUtils.release(join);
                    //修改返回內(nèi)容,返回內(nèi)容是JSON字符串
                    //byte[] uppedContent = responseData.getBytes();
                    //return bufferFactory.wrap(uppedContent);
                    return bufferFactory.wrap(content);
                });
                return super.writeWith(body);
            }
        };
        return chain.filter(exchange.mutate().response(decoratedResponse).build());
    }

    @Override
    public int getOrder() {
        //-1是響應寫入過濾器,必須在此之前調(diào)用,因此return必須小于或等于-2。
        return -2;
    }
}

合并寫法

RequestAndResponseGlobalFilter.java文章來源地址http://www.zghlxwxcb.cn/news/detail-602593.html

@Slf4j
@Component
public class RequestGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getPath().value();
        String method = request.getMethodValue();
        HttpHeaders header = request.getHeaders();
        String requestParams = String.valueOf(request.getQueryParams());
        AtomicReference<String> requestBody = new AtomicReference<>("");
        log.info("***********************************請求信息**********************************");
        log.info("URI = {}", URIPath);
        log.info("path = {}", path);
        log.info("header = {}", header);
        log.info("requestParams = {}", requestParams);

        String contentType = header.getFirst("content-type");
        if (StringUtils.hasLength(contentType) && contentType.contains("multipart/form-data")) {
            return chain.filter(exchange);
        }

        //response返回內(nèi)容
        ServerHttpResponse originalResponse = exchange.getResponse();
        DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory();
        ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
            @Override
            public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
                Flux<? extends DataBuffer> fluxBody = Flux.from(body);
                body = fluxBody.buffer().map(dataBuffers -> {
                    DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
                    DataBuffer join = dataBufferFactory.join(dataBuffers);
                    byte[] content = new byte[join.readableByteCount()];
                    join.read(content);
                    String responseData = new String(content, StandardCharsets.UTF_8);
                    log.info("***********************************響應信息**********************************");
                    log.info("響應內(nèi)容:{}", responseData);
                    log.info("****************************************************************************\n");
                    DataBufferUtils.release(join);
                    
                	//TODO 使用@Ansync異步方法日志入庫
                	//修改返回內(nèi)容,返回內(nèi)容是JSON字符串,因此需要把JSON轉(zhuǎn)成具體的對象再處理。
                	//R r = om.readValue(responseData, R.class);//R是統(tǒng)一泛型返回對象,這里因人而已,不具體介紹。
                	//String newContent = om.writeValueAsString(r);
                	//return bufferFactory.wrap(newContent.getBytes());
                	return bufferFactory.wrap(content);
                });
                return super.writeWith(body);
            }
        };
        log.info("****************************************************************************\n");

        //獲取body,雖然該方法在后面,但是實際效果是在response前面
        if (header.getContentLength() > 0) {
            return DataBufferUtils.join(exchange.getRequest().getBody()).flatMap(dataBuffer -> {
                byte[] bytes = new byte[dataBuffer.readableByteCount()];
                dataBuffer.read(bytes);
                String bodyString = new String(bytes, StandardCharsets.UTF_8);
                //設置requestBody到變量,讓response獲取
                requestBody.set(bodyString);
                log.info("requestBody = {}", bodyString);
                exchange.getAttributes().put("POST_BODY", bodyString);
                DataBufferUtils.release(dataBuffer);
                Flux<DataBuffer> cachedFlux = Flux.defer(() -> Mono.just(exchange.getResponse().bufferFactory().wrap(bytes)));

                ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) {
                    @Override
                    public Flux<DataBuffer> getBody() {
                        return cachedFlux;
                    }
                };
                return chain.filter(exchange.mutate().request(mutatedRequest).response(decoratedResponse).build());
            });
        }

        //沒有獲取BODY,不用處理request
        return chain.filter(exchange.mutate().response(decoratedResponse).build());
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

到了這里,關于springcloud的gateway之GlobalFilter獲取請求信息及requestBody的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • SpringCloud Gateway 打印請求響應日志

    SpringCloud Gateway 打印請求響應日志

    version spring-cloud 2021.0.1 spring-boot 2.6.3 spring-cloud-alibaba 2021.0.1.0 網(wǎng)關不是基于springmvc的,而是基于webflux去做的 SpringCloudGateway中Post請求參數(shù)只能讀取一次 這是因為Gateway默認使用的是SpringWebflux,解決這個問題需要容重新構造一個request來替換原先的request CacheBodyGlobalFilter這個全局過

    2024年02月02日
    瀏覽(97)
  • springcloud gateway中打印請求參數(shù),請求路徑和返回數(shù)據(jù)

    springcloud gateway中打印請求參數(shù),請求路徑和返回數(shù)據(jù)

    在平時前后端聯(lián)調(diào)過程中,需要查詢?nèi)罩究吹角岸苏埱蟮慕涌?,上送的參?shù),返回數(shù)據(jù)這樣有利于我們定位問題;話不多說直接上代碼。 在gateway模塊中,新建一個filter的包,然后創(chuàng)建改類,即可在控制臺和日志文件里面打印出請求參數(shù),只寫了常用的 post 和 get 請求的方式;

    2024年02月15日
    瀏覽(22)
  • SpringCloud Gateway實現(xiàn)請求解密和響應加密

    SpringCloud Gateway實現(xiàn)請求解密和響應加密

    本文環(huán)境使用比較新的 Java 17 和 SpringBoot 3.1.5,對應到Spring的版本是 6.0.13 使用到的三方插件有: lombok gson hutool 本文注重實現(xiàn)請求的解密和響應的加密,加解密使用的是 Hutool 中的工具類,加解密算法目前提供了AES的方式,其余方式也可兼容擴展。 完整代碼倉庫:https://gite

    2024年02月06日
    瀏覽(35)
  • 深入解析Spring Cloud Gateway的GlobalFilter

    深入解析Spring Cloud Gateway的GlobalFilter

    本文將詳細介紹Spring Cloud Gateway中的GlobalFilter,解釋其作用以及如何使用。通過代碼示例,讀者將深入了解GlobalFilter在Spring Cloud Gateway中的應用,以及如何自定義和配置GlobalFilter來實現(xiàn)定制化的網(wǎng)關邏輯。 Spring Cloud Gateway是Spring Cloud生態(tài)系統(tǒng)中的一員,是基于Spring Framework 5、

    2024年04月10日
    瀏覽(62)
  • SpringCloud Gateway 整合RSA對請求參數(shù)解密、響應結果加密【SpringCloud系列10】

    SpringCloud Gateway 整合RSA對請求參數(shù)解密、響應結果加密【SpringCloud系列10】

    本文章實現(xiàn)的是 網(wǎng)關中的 參數(shù)解密、響應數(shù)據(jù)體加密功能。 1 集成 commons-codec commons-codec 是Apache開源組織提供的用于摘要運算、編碼解碼的包。常見的編碼解碼工具Base64、MD5、Hex、SHA1、DES等。 本項目中集成RSA 非對稱算法,RSAUtils 工具類 然后創(chuàng)建一個測試類,生成一組公鑰

    2024年02月06日
    瀏覽(21)
  • Spring Cloud Gateway過濾器GlobalFilter詳解

    Spring Cloud Gateway過濾器GlobalFilter詳解

    一、過濾器的場景 在springCloud架構中,網(wǎng)關是必不可少的組件,它用于服務路由的轉(zhuǎn)發(fā)。對客戶端進行屏蔽微服務的具體細節(jié),客戶端只需要和網(wǎng)關進行交互。所以網(wǎng)關顧名思義,就是網(wǎng)絡的一個關卡。它就是一座城的城門守衛(wèi)。所以這個守衛(wèi)就可以做很多工作,比如對來訪

    2024年02月14日
    瀏覽(15)
  • springcloud gateway 配置predicates 多個path;路由請求頭新增參數(shù)

    一、 在一個微服務節(jié)點的predicates下配置多個path: - Path=/test/batis/test,/test/testJmeter,具體配置如下: 二、 在請求頭中新增header參數(shù),yml文件配置如下: 三、自定義filter中新增請求頭參數(shù):

    2024年02月16日
    瀏覽(27)
  • SpringCloud GateWay通過過濾器GatewayFilter修改請求或響應內(nèi)容

    Spring Cloud Gateway在有些場景中需要獲取request body內(nèi)容進行參數(shù)校驗或參數(shù)修改,我們通過在GatewayFilter中獲取請求內(nèi)容來獲取和修改請求體,下面我們就基于ServerWebExchange來實現(xiàn): ServerWebExchange命名為服務網(wǎng)絡交換器,存放著重要的請求-響應屬性、請求實例和響應實例等等,有

    2024年02月16日
    瀏覽(21)
  • Spring Cloud Gateway GlobalFilter(全局過濾器)詳解(官方原版)

    GlobalFilter接口具有與GatewayFilter相同的簽名。這些是有條件地應用于所有路由的特殊過濾器。 當請求與路由匹配時,過濾web處理程序會將GlobalFilter的所有實例和GatewayFilter的所有路由特定實例添加到過濾器鏈中。這個組合過濾器鏈由org.springframework.core.Ordered接口排序,您可以通

    2024年02月09日
    瀏覽(16)
  • SpringCloud微服務之間如何進行用戶信息傳遞(涉及:Gateway、OpenFeign組件)

    SpringCloud微服務之間如何進行用戶信息傳遞(涉及:Gateway、OpenFeign組件)

    在業(yè)務微服務中通過工具類獲取當前用戶信息 網(wǎng)關微服務(Gateway)往業(yè)務微服務傳遞用戶信息 業(yè)務微服務之間通過OpenFeign傳遞用戶信息 只要把上面兩處打通,然后業(yè)務微服務在通過攔截器獲取到用戶信息,之后再將用戶信息存在ThreadLocal中,這樣我們就可以實現(xiàn)在業(yè)務微服

    2024年02月13日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包