Spring Cloud Alibaba Gateway全局token过滤、局部过滤访问时间超过50ms日志提示

文章目录

Spring Cloud Alibaba Gateway验证token

基础搭建
前篇

在前篇的基础上加入依赖

java 复制代码
<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.18</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

在filter包中创建tokenFilter

java 复制代码
@Component
@Slf4j
public class TokenFilter implements GlobalFilter, Ordered {
    @Value("${token.key}")
    private String tokenKey;
    private static final String TOKEN = "token";

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

        //生成一个token
/*        Map<String, Object> map = new HashMap<>();
        map.put("id", 100);
        map.put("nickName", "张三");
        map.put("tel", "10086");
        map.put(JWT.EXPIRES_AT, System.currentTimeMillis() + 2 * 24 * 6 * 6 * 1000);
        String token1 = JWTUtil.createToken(map, tokenKey.getBytes());*/

        List<String> strings = exchange.getRequest().getHeaders().get(TOKEN);
        ServerHttpResponse response = exchange.getResponse();

        if (ObjectUtil.isEmpty(strings)) {
            log.debug("token为空,不予通行");

            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }
        String token = strings.get(0);
        boolean verify = false;
        try {
            verify = JWTUtil.verify(token, tokenKey.getBytes(StandardCharsets.UTF_8));
        } catch (Exception ex) {
            log.error("出现错误{}", ex.getMessage());
            ex.printStackTrace();
        }

        if (!verify) {
            log.error("token不对,不要投机取巧");
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }

        JWTPayload payload = JWTUtil.parseToken(token).getPayload();
        log.info("通过,大大滴好!!");
        return chain.filter(exchange);
    }

    //配置第一顺位执行
    @Override
    public int getOrder() {
        return 1;
    }
}

自行访问

Spring Cloud Alibaba Gateway局部过滤

1.继承AbstractGatewayFilterFactory

加入配置

spring.cloud.gateway.routes[0].filters[4] = LogTime=50

  • 这里配置的LogTime 与 类名前面的对应
  • AbstractNameValueGatewayFilterFactory可以仿照这个类写 进入ieda 两下shift
java 复制代码
@Component
@Slf4j
public class LogTimeGatewayFilterFactory extends AbstractGatewayFilterFactory<LogTimeGatewayFilterFactory.Config> {

    private String TIMESPAN = "timeSpan";
    public LogTimeGatewayFilterFactory() {
        super(LogTimeGatewayFilterFactory.Config.class);
    }
    public List<String> shortcutFieldOrder() {
        return Arrays.asList(TIMESPAN);
    }
    @Override
    public GatewayFilter apply(Config config) {
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain) {
                long start = System.currentTimeMillis();
                exchange.getAttributes().put("start", start);
                return chain.filter(exchange).then(Mono.fromRunnable(()->{
                    long end = System.currentTimeMillis();
                    long start1 = exchange.getAttribute("start");
                    HttpRequest request = exchange.getRequest();
                    URI uri = request.getURI();
                    if(config.timeSpan > (end - start1)){
                        log.info("uri伟{}不错!{}在50ms之内",uri,end - start1);
                    }
                    log.info("uri伟{}不行!太慢啦{}",uri,end - start1);

                }));
            }
        };
    }
    @Validated
    //启用参数验证似乎
    public static class Config{
        private int timeSpan;

        public int getTimeSpan() {
            return timeSpan;
        }

        public void setTimeSpan(int timeSpan) {
            this.timeSpan = timeSpan;
        }
    }

}

2.仿照AddRequestHeaderGatewayFilterFactory

继承AbstractNameValueGatewayFilterFactory

java 复制代码
@Component
@Slf4j
public class LogTime2GatewayFilterFactory extends AbstractNameValueGatewayFilterFactory{

    public LogTime2GatewayFilterFactory() {
    }

    public GatewayFilter apply(final AbstractNameValueGatewayFilterFactory.NameValueConfig config) {
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain) {
                long start = System.currentTimeMillis();
                exchange.getAttributes().put("start", start);
                return chain.filter(exchange).then(Mono.fromRunnable(()->{
                    long end = System.currentTimeMillis();
                    long start1 = exchange.getAttribute("start");
                    HttpRequest request = exchange.getRequest();
                    URI uri = request.getURI();
                    if(Integer.parseInt(config.getValue()) > (end - start1)){
                        log.info("logTime2 uri伟{}不错!{}在50ms之内",uri,end - start1);
                    }
                    log.info("logTime2 uri伟{}不行!太慢啦{}",uri,end - start1);

                }));
            }

            public String toString() {
                return GatewayToStringStyler.filterToStringCreator(LogTime2GatewayFilterFactory.this).append(config.getName(), config.getValue()).toString();
            }
        };
    }

}

证明参数注入成功

相关推荐
暗夜猎手-大魔王5 小时前
转载--AI Agent 架构设计:Gateway 架构设计(OpenClaw、Claude Code、Hermes Agent 对比)
gateway
SarL EMEN6 小时前
Gateway Timeout504 网关超时的完美解决方法
gateway
2601_949194261 天前
Gateway Timeout504 网关超时的完美解决方法
gateway
码点滴2 天前
私有 Gateway 接入企业 IM:从消息路由到多租户隔离——Hermes Agent 工程实战
人工智能·架构·gateway·prompt·智能体·hermes
代码写到35岁2 天前
Gateway+OpenFeign 踩坑总结
gateway
invicinble2 天前
对于gateway信息量沉淀
gateway
郝开3 天前
Spring Cloud Gateway 3.5.14 使用手册
java·数据库·spring boot·gateway
Ribou4 天前
Kubernetes v1.35.2 基于 Cilium Gateway API 的服务访问架构
架构·kubernetes·gateway
huipeng9265 天前
GateWay使用详解
java·spring boot·spring cloud·微服务·gateway
随风,奔跑9 天前
Spring Cloud Alibaba(四)---Spring Cloud Gateway
后端·spring·gateway