SpringCloud局部过滤器自定义

一、实现步骤:

  1. 在gateway_service中编写MyParamGatewayFilterFactory类
  2. 实现业务代码:循环请求参数中是否包含name,如果包含则输出参数值
  3. 修改配置文件
  4. 访问请求测试,带name参数

二、在gateway_service中编写MyParamGatewayFilterFactory类

package com.william.filters;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.List;
/**
 * 命名有要求:
 * MyParam(自定义) GatewayFilterFactory(固定写法)
 */
@Component//千万不要忘记注入Spring容器
public class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory<MyParamGatewayFilterFactory.Config> {
    /**
     * Prefix key.
     */
    public static final String PARAM_NAME = "name";


    public MyParamGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList(PARAM_NAME);
    }

    public GatewayFilter apply(Config config) {

        GatewayFilter gatewayFilter  = new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                /**
                 * 拦截所有请求,如果参数中包含name,把参数打印到控制台
                 */
                //获取请求对象
                ServerHttpRequest request = exchange.getRequest();
                //获取所有参数
                String name = request.getQueryParams().getFirst("name");
                //如果name有值 = null "" "  " "   "
                if (!StringUtils.isEmpty(name)) {
                    System.out.printf("局部过滤器,拦截 name=%s !!!!", name);
                }
                return chain.filter(exchange);//放行所有请求
            }
        };
        return gatewayFilter;
    }

    public static class Config {

        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

三、 修改配置文件

在这里插入图片描述

四、访问请求测试,带name参数

在这里插入图片描述
在这里插入图片描述

Spring Cloud Gateway 是基于 Spring WebFlux 框架开发的网关组件,提供了一种简单、轻量级的方式来构建微服务架构中的路由和过滤器。 要实现局部过滤器,可以在 Gateway 配置文件中为特定的路由添加过滤器。以下是一种实现方式: 1. 在 Spring Cloud Gateway 配置文件中,定义一个路由规则并指定路由的 ID 和目标 URL,例如: ```yaml spring: cloud: gateway: routes: - id: my_route uri: http://example.com filters: - name: my_filter args: key: value ``` 2. 创建一个自定义过滤器类,实现 `GatewayFilter` 接口,例如: ```java import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.http.HttpStatus; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; public class MyFilter implements GatewayFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 这里可以编写自定义的过滤逻辑 // 例如,根据请求头信息进行验证 String authToken = exchange.getRequest().getHeaders().getFirst("Authorization"); if (authToken == null || !authToken.startsWith("Bearer ")) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } // 满足条件则继续执行后续过滤器或路由处理器 return chain.filter(exchange); } } ``` 3. 在 Spring Boot 应用程序中,将自定义过滤器注册为一个 Bean,例如: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class GatewayConfig { @Bean public MyFilter myFilter() { return new MyFilter(); } } ``` 这样,在配置文件中指定的路由上会应用自定义过滤器。你可以根据实际需求编写不同的过滤器类来实现各种局部过滤器的逻辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值