gateway获取请求体

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gateway获取请求体相关的知识,希望对你有一定的参考价值。

参考技术A 自定义拦截器,order不要修改

                /**

* 获取request的内容用

*/

@Component

public class CacheBodyGlobalFilter implements Ordered, GlobalFilter

    /**

    * 注入 事件发布类

    */

    @Autowired

    ApplicationEventPublisher eventPublisher;

    @Override

    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)

        Route route = (Route) exchange.getAttributes().get(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);

        eventPublisher.publishEvent(new EnableBodyCachingEvent(this, route.getId()));

        return chain.filter(exchange);

   

    @Override

    public int getOrder()

        return -2147482649;

   



其他拦截器即可获取请求

                private String getRequestParam(ServerWebExchange exchange)

  String requestBody = "";

  HttpMethod method = exchange.getRequest().getMethod();

  if(method.matches(HttpMethod.GET.name()))

      requestBody = exchange.getRequest().getQueryParams().entrySet().stream().map(entry->

        return String.format("%s : %s",entry.getKey() , String.join(";", entry.getValue()));

      ).collect(Collectors.joining("\n"));

  else

      Object dataBuffer = exchange.getAttributes().get("cachedRequestBody");

      if(dataBuffer instanceof NettyDataBuffer)

        NettyDataBuffer nettyDataBuffer = (NettyDataBuffer)dataBuffer;

        requestBody = convertByteBufToString(nettyDataBuffer.getNativeBuffer());

        //文件类型去掉文件内容

        requestBody = requestBody.replaceAll("Content-Type:[\\s\\S]*?----------------------------", "文件内容被替换");

     

 

  return requestBody;

在 Spring Cloud Gateway 预过滤器中获取 SecurityContextHolder

【中文标题】在 Spring Cloud Gateway 预过滤器中获取 SecurityContextHolder【英文标题】:Getting SecurityContextHolder in Spring Cloud Gateway Pre Filter 【发布时间】:2020-08-26 02:36:13 【问题描述】:

我在 Spring Boot 项目(版本 2.2.6)中使用 Spring Cloud Gateway 和 Spring Security。我有一个自定义的 Pre 过滤器,它需要在将请求转发到下游服务之前向请求添加标头。 Pre 过滤器需要读取 Spring Security 的 Authentication 对象以获取权限,然后才能添加标头(它需要根据权限进行一些查找)。由于 Spring Cloud Gateway 是反应式的,我不能使用静态 SecurityContextHolder 类。参考这个 *** 问题ReactiveSecurityContextHolder.getContext() is empty but @AuthenticationPrincipal works,我在我的自定义前置过滤器中尝试了以下操作:

ReactiveSecurityContextHolder.getContext().map(ctx -&gt; ctx.getAuthentication()).block()

正如 OP 发布的那样,它不起作用并返回 null。有一些关于在那个 *** 问题中创建自定义过滤器的建议。但我没有尝试过,因为我想从自定义过滤器访问 Authentication 对象。 Spring Cloud Gateway自定义过滤器中是否没有直接获取Authentication对象的方法?

谢谢

【问题讨论】:

【参考方案1】:

下面的代码 sn-p 是一个简单的过滤器示例,它提供对身份验证上下文的访问:

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) 
    Mono<Void> monoFilter = ReactiveSecurityContextHolder.getContext().map(sc -> sc.getAuthentication())
            .flatMap(authentication -> 

                // here you can access to Authentication object
                // and implement the pre-filter logic

                return chain.filter(exchange);

            );

    return monoFilter;

【讨论】:

以上是关于gateway获取请求体的主要内容,如果未能解决你的问题,请参考以下文章

提供一个SpringCloud Gateway获取body参数的方法

java获取post请求的请求体怎么写变量

04 FastApi的请求体

nestjs 中间件获取请求/响应体

Django中获取参数(路径,查询,请求头,请求体)

SpringBoot 请求消息体解密(通信加密解密)