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 -> 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获取请求体的主要内容,如果未能解决你的问题,请参考以下文章