U闲程序猿 2024-10-17 11:03 采纳率: 0%
浏览 4

Gateway提取不同MediaType类型的body参数

通过Gateway网关获取到了String类型的body参数

String body = exchange.getAttribute(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR);

现在想根据当前请求的MediaType(form-data、JSON等)类型提取参数进行验签

  • 写回答

1条回答 默认 最新

  • 越重天 新星创作者: Java技术领域 2024-10-17 11:38
    关注

    本答案参考 多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢

    以下是一个使用Java在Gateway(假设是Spring Cloud Gateway)中根据不同MediaType类型提取body参数进行验签的示例:

    1. 添加依赖(如果使用Maven)

      • 对于处理JSON,需要添加jackson - databind依赖:
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson - databind</artifactId>
        </dependency>
        
    2. 根据MediaType类型提取参数的Java代码示例

      • 首先,需要导入必要的包:

        import com.fasterxml.jackson.databind.ObjectMapper;
        import org.springframework.cloud.gateway.filter.GatewayFilter;
        import org.springframework.cloud.gateway.filter.GatewayFilterChain;
        import org.springframework.core.io.buffer.DataBuffer;
        import org.springframework.http.HttpHeaders;
        import org.springframework.http.MediaType;
        import org.springframework.http.server.reactive.ServerHttpRequest;
        import org.springframework.web.server.ServerWebExchange;
        import reactor.core.publisher.Mono;
        
      • 然后,创建一个GatewayFilter来处理请求:

        public class BodyParamExtractorFilter implements GatewayFilter {
        
          private final ObjectMapper objectMapper = new ObjectMapper();
        
          @Override
          public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
              ServerHttpRequest request = exchange.getRequest();
              HttpHeaders headers = request.getHeaders();
              MediaType mediaType = headers.getContentType();
        
              String body = exchange.getAttribute(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR);
        
              if (mediaType!= null) {
                  if (MediaType.APPLICATION_JSON.isCompatibleWith(mediaType)) {
                      try {
                          // 假设这里有一个简单的Java对象用于接收JSON数据
                          // 例如:MyObject myObject = objectMapper.readValue(body, MyObject.class);
                          // 这里可以进行针对JSON数据的验签操作
                      } catch (Exception e) {
                          // 处理JSON解析错误
                      }
                  } else if (MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType)) {
                      // 处理form - data类型的参数提取和验签
                      // 例如,可以使用类似如下的方式解析参数
                      // MultiValueMap<String, String> formData = UriComponentsBuilder.fromUriString(body).build().getQueryParams();
                      // 然后进行验签操作
                  }
              }
        
              return chain.filter(exchange);
          }
        }
        

    在上述代码中:

    • 首先获取请求的MediaType
    • 如果MediaTypeAPPLICATION_JSON,尝试使用JacksonObjectMapper来解析body中的JSON数据,这里只是给出了一个基本的框架,实际应用中需要根据具体的JSON结构定义相应的Java对象进行解析。
    • 如果MediaTypeAPPLICATION_FORM_URLENCODED(用于form - data类型),可以使用UriComponentsBuilder来解析参数。

    要将这个过滤器添加到Spring Cloud Gateway的配置中,可以通过RouteLocatorBuilder来实现:

    import org.springframework.cloud.gateway.route.RouteLocator;
    import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class GatewayConfig {
    
        @Bean
        public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
            return builder.routes()
                  .route("my_route", r -> r.path("/my - path/**")
                          .filters(f -> f.filter(new BodyParamExtractorFilter()))
                          .uri("http://my - downstream - service"))
                  .build();
        }
    }
    

    这样,当请求匹配到/my - path/**路径时,会经过BodyParamExtractorFilter来根据MediaType提取和处理body参数进行验签操作。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月17日