gateway自定义处理request请求体和response响应体

本文介绍了将zuul网关升级到gateway时遇到的挑战,特别是如何在gateway中实现请求体验证签名和加密的逻辑。文章详细分享了RequestValidationFilter和ResponseValidationFilter的使用,以解决请求体和响应体的处理问题。
摘要由CSDN通过智能技术生成

介绍

本人最近将网关zuul升级到gateway,gateway特点这里不多说了,gateway和zuul的区别很大,其底层使用了netty和响应式编程,而不是zuul常规的servlet方式。

原先的zuul网关里有对请求体验证签名和加密的逻辑,要把这些逻辑迁移到gateway中,这个过程中遇到的问题太多,例如 处理中异常如何处理、请求体或响应体过长会被拦截等等。这里把gateway通过的逻辑进行改造后直接贴出来,需要自己处理的逻辑可以直接添加进去。

处理请求体内容

RequestValidationFilter

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

    @Autowired
    private ServerCodecConfigurer serverCodecConfigurer;
    

    @Override
    public Mono<Void> filter(final ServerWebExchange exchange, final GatewayFilterChain chain) {
   
        return readBody(exchange,chain);
           
    }

    private Mono<Void> readBody(ServerWebExchange exchange, GatewayFilterChain chain){
   
        log.info("current thread readBody : {}",Thread.currentThread().getName());
        
        ServerRequest serverRequest = ServerRequest.create(exchange, serverCodecConfigurer.getReaders());
        
        Map<String,String> headMap = new HashMap<>();
        Mono<String> modifiedBody = serverRequest.bodyToMono(String.class).flatMap(originalBody -> {
   
            //处理请求体和请求头逻辑的方法
            String body = handle(originalBody, exchange, headMap);
            return Mono.just(body);
        });
        BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class);
        HttpHeaders headers = new HttpHeaders();
        headers.putAll(exchange.getRequest().getHeaders());
        headers.remove(
如果你不想实现 `GlobalFilter` 接口,也可以自定义一个 `GatewayFilter` 来实现自己的逻辑。在这个自定义的 `GatewayFilter` 中,你可以获取到 `ServerWebExchange` 对象,从而获取到请求响应相关的信息。 以下是一个示例代码,展示了如何在自定义 `GatewayFilter` 中获取请求响应,并将响应内容输出到日志中: ```java @Component public class CustomGatewayFilter implements GatewayFilter { private static final Logger logger = LoggerFactory.getLogger(CustomGatewayFilter.class); @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); logger.info("Request URI: {}", request.getURI()); return chain.filter(exchange).then(Mono.fromRunnable(() -> { logger.info("Response status code: {}", response.getStatusCode()); response.getBody().subscribe(dataBuffer -> { byte[] bytes = new byte[dataBuffer.readableByteCount()]; dataBuffer.read(bytes); String body = new String(bytes, StandardCharsets.UTF_8); logger.info("Response body: {}", body); }); })); } } ``` 在这个示例中,我们定义了一个名为 `CustomGatewayFilter` 的类,实现了 `GatewayFilter` 接口。在 `filter` 方法中,我们通过 `ServerWebExchange` 对象获取到了请求响应的信息,并将响应内容输出到日志中。最后,我们调用了 `chain.filter(exchange)` 方法来继续执行下一个 `GatewayFilter` 或者路由处理器。注意,我们使用了 `then` 方法来注册一个回调,以便在响应完成后输出日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值