spring cloud gateway 修改请求路径Path

本文介绍了一个Spring Cloud Gateway的实现案例,通过自定义过滤器来根据URL中的特定参数修改请求路径,实现了灵活的服务路由功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景:

   项目升级改造,老项目使用请求url中特定参数进行服务路由,现使用gateway网关进行路由服务信息

二、根据参数信息修改请求路径Path

@Component
public class RequestFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest str = exchange.getRequest();
        if (str.getQueryParams().containsKey("demo")){
            addOriginalRequestUrl(exchange, str.getURI());
            String newPath =str.getPath()+"demo";
            ServerHttpRequest newRequest = str.mutate()
                    .path(newPath)
                    .build();
            exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, newRequest.getURI());
            return chain.filter(exchange.mutate()
                    .request(newRequest).build());
        }
        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        return 1;
    }

1、根据url路径是否包含特定参数demo字段进行过滤

2、注意这个只是修改path路径值,并不能修改gateway路由得serverid

3、getOrder方法 执行顺先顺序0-100 

Spring Cloud Gateway修改请求体参数,可以使用Spring Cloud Gateway提供的一些过滤器来实现。具体步骤如下: 1. 创建一个过滤器类,继承AbstractGatewayFilterFactory类,实现filter方法,该方法用于修改请求体参数。例如: ``` public class ModifyRequestBodyGatewayFilterFactory extends AbstractGatewayFilterFactory<ModifyRequestBodyGatewayFilterFactory.Config> { public ModifyRequestBodyGatewayFilterFactory() { super(Config.class); } @Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { // 获取请求体参数 ServerHttpRequest request = exchange.getRequest(); Flux<DataBuffer> body = request.getBody(); MediaType contentType = request.getHeaders().getContentType(); Charset charset = contentType.getCharset() != null ? contentType.getCharset() : StandardCharsets.UTF_8; // 修改请求体参数 String bodyStr = body.map(dataBuffer -> { byte[] bytes = new byte[dataBuffer.readableByteCount()]; dataBuffer.read(bytes); DataBufferUtils.release(dataBuffer); return new String(bytes, charset); }).reduce((s1, s2) -> s1 + s2).orElse(""); String modifiedBodyStr = modify(bodyStr); // 构造新的请求体参数 byte[] newBodyBytes = modifiedBodyStr.getBytes(charset); DataBuffer newBodyBuffer = request.bufferFactory().wrap(newBodyBytes); // 构造新的请求对象 ServerHttpRequest newRequest = request.mutate().body(Mono.just(newBodyBuffer)).build(); // 继续执行后续过滤器链 return chain.filter(exchange.mutate().request(newRequest).build()); }; } private String modify(String body) { // 在此处实现修改请求体参数的逻辑 return body; } public static class Config { // 配置参数 } } ``` 2. 在配置文件中配置过滤器,例如: ``` spring: cloud: gateway: routes: - id: modify_request_body_route uri: http://localhost:8080 predicates: - Path=/modifyRequestBody filters: - ModifyRequestBody=modifyRequestBodyFilter default-filters: - ModifyRequestBody=defaultModifyRequestBodyFilter ``` 其中,ModifyRequestBody为过滤器类的名称,modifyRequestBodyFilter和defaultModifyRequestBodyFilter为过滤器实例的名称,可以根据实际需求进行修改。 3. 在控制器中接收修改后的请求体参数,例如: ``` @PostMapping("/modifyRequestBody") public String modifyRequestBody(@RequestBody String requestBody) { // 处理请求体参数 return "success"; } ``` 在上述代码中,@RequestBody注解用于接收请求体参数。如果请求体参数已经被修改,那么控制器中接收到的参数就是修改后的参数。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值