首页 > 其他分享 >gateway拦截器获取请求参数

gateway拦截器获取请求参数

时间:2024-11-24 17:48:45浏览次数:6  
标签:拦截器 return 请求 exchange springframework HttpHeaders org import gateway

package com.dp.config;

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.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ReactiveHttpOutputMessage;
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.HandlerStrategies;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import javax.validation.constraints.NotNull;

/**
 * @author LLF
 * @title RequestBodyFilter
 * @date 2024/11/24 17:23
 * @description TODO
 */

@Component
public class RequestBodyFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String uri = request.getURI().toString();
        HttpMethod method = request.getMethod();
        MediaType contentType = request.getHeaders().getContentType();
        if (HttpMethod.POST.equals(method)) {
            if (contentType != null && !contentType.toString().contains(MediaType.MULTIPART_FORM_DATA_VALUE)) {
                System.out.println("请求路径 {} 请求方法 {} 请求类型 {}"+uri+method.name()+ contentType);
                // ServerRequest serverRequest = new DefaultServerRequest(exchange);
                // 应该是版本问题,此版本的 DefaultServerRequest 类不是公共类,不能直接 new,需要改写下边的方式
                ServerRequest serverRequest = ServerRequest.create(exchange, HandlerStrategies.withDefaults().messageReaders());
                Mono<String> modifiedBody = serverRequest.bodyToMono(String.class)
                        .flatMap(body -> {
                            System.out.println("请求体 {}"+ body);
                            return Mono.just(body);
                        });
                BodyInserter<Mono<String>, ReactiveHttpOutputMessage> bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class);
                HttpHeaders headers = new HttpHeaders();
                headers.putAll(request.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(request) {
                                @NotNull
                                @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;
                                }

                                @NotNull
                                @Override
                                public Flux<DataBuffer> getBody() {
                                    return outputMessage.getBody();
                                }
                            };
                            return chain.filter(exchange.mutate().request(decorator).build());
                        }));
            } else {
                System.out.println("请求路径 {} 请求方法 {} 请求类型 {} 文件上传 不获取参数"+uri+method.name()+contentType);
            }
        }
        if (HttpMethod.GET.equals(method)) {
            String body = request.getQueryParams().toString();
            System.out.println("请求路径 {} 请求方法 {} 请求类型 {} 请求参数 {}"+","+uri+","+method.name()+","+contentType+","+body);
            return chain.filter(exchange);
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -100;
    }

}

 

标签:拦截器,return,请求,exchange,springframework,HttpHeaders,org,import,gateway
From: https://www.cnblogs.com/-llf/p/18566041

相关文章

  • 使用 JavaScript 的 XMLHttpRequest 或 Fetch API 发送 HTTP 请求时,GET 请求和 POST
    使用JavaScript的XMLHttpRequest或FetchAPI发送HTTP请求时,GET请求和POST请求处理参数的方式不同,这与HTTP协议的设计有关GET请求的参数特点:GET请求的参数通过URL传递。原因:URL表现方式:GET请求的主要目的是从服务器获取资源。URL是资源的唯一标识,因此GET......
  • RocketMQ消息者PULL请求模式拉取消息
    引言RocketMQ消费者PULL请求模式拉取消息,是通过消费者端与服务端Broker的多个线程进行配合,做到消息拉取的及时与减少拉取的Broker性能损耗(通过长连接)。消费者处理发起拉取请求的线程PullMessageService服务端Broker处理未拉取到消息的hold线程PullRequestHoldService服......
  • js逆向实战之某二手平台请求参数加密逻辑
    声明:本篇文章仅用于知识分享,不得用于其他用途网址:https://www.goofish.com/加密逻辑随便点击一个模块,看触发的数据包。再选择一个模块,看哪些参数会变化。比较一下得知t和sign的值会变化。请求数据中的machId是根据所选模块变化的。主要关注sign的加密逻辑,搜索请求参数中......
  • 使用 HandlerInterceptor 拦截请求
    简介HandlerInterceptor是SpringMVC中的一个接口,用于在处理请求之前和之后进行一些操作。它可以用于日志记录、身份验证、权限检查等功能。以下是HandlerInterceptor接口定义:publicinterfaceHandlerInterceptor{ defaultbooleanpreHandle(HttpServletRequestrequ......
  • 为什么 Spring Boot 的微服务架构被称为“现代应用开发的曙光”?这种设计真的解决了传
    目录1.微服务架构为何被称为“现代应用开发的曙光”1.1单体架构的问题1.2微服务架构的诞生与发展1.3微服务架构的挑战2.SpringBoot在微服务中的角色2.1自动化配置与微服务开发2.2SpringCloud生态中的微服务3.微服务架构是否真的解决了传统单体架构中的所......
  • JavaWeb合集17-拦截器(Interceptor)和过滤器(Filter)
    十七、拦截器和过滤器在JavaWeb开发中,拦截器(Interceptor)和过滤器(Filter)都是用于在请求处理前后执行某些操作的机制。虽然它们的功能相似,但在实现方式、使用场景和灵活性方面有一些重要的区别。1、拦截器和过滤器的区别及选择1.1拦截器定义:拦截器是Spring框架提供......
  • Spring Cloud --- Gateway自定义全局过滤器
    Gateway自定义全局过滤器介绍全局过滤器对所有路由生效。新建类MyGlobalFilter并实现GlobalFilter,Ordered两个接口自定义接口调用耗时统计的全局过滤器@Component@Slf4jpublicclassMyGlobalFilterimplementsGlobalFilter,Ordered{publicstaticfinalS......
  • Java调用第三方接口、http请求详解,一文学会
    系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据......
  • springmv的过滤器和拦截器的区别是什么
    一个请求进来的时候,先交给web服务器提供的过滤器,例如springboot项目,提供的服务器也就是内置的tomcat,过滤器处理完成以后,然后会来到servlet,有一个dispatcherServlet会调用拦截器,再由dispatcherServlet分发给对应的Controller,处理完请求后,会原路返回,再回到拦截器,再回到过滤器,最终响......
  • Spingboot 定时任务与过滤器,拦截器
     在boot环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用Spring自带的定时任务处理器@Scheduled注解,另一种就是使用第三方框架Quartz,SpringBoot源自Spring+SpringMVC,因此天然具备这两个Spring中的定时任务实现策略,当然也支持Quartz1.定时任务@Sched......