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.routes0.filters4 = 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();
            }
        };
    }

}

证明参数注入成功

相关推荐
Song_RsHt12 小时前
Gateway(下):过滤器与统一鉴权
spring boot·spring·gateway
Raas10013 小时前
MAI Gateway(魔芋企业级AI网关)选购攻略:AI网关哪个好?避坑指南与对比
大数据·人工智能·ai·gateway·ai网关·企业级ai网关
Song_RsHt17 小时前
Gateway (上):路由与转发,微服务的统一入口
java·笔记·后端·学习·gateway
4SAPI2 天前
官方API、API聚合平台与自建LLM Gateway:三种方案怎么选
大数据·人工智能·gateway·php
Raas1003 天前
AI网关怎么选?MAI Gateway(魔芋企业级AI网关)入选2026年企业级AI网关推荐清单
大数据·网络·人工智能·gateway·mai gateway
Raas1003 天前
AI网关能做调用审计吗?MAI Gateway(魔芋企业级AI网关)实战能力深度解读
java·服务器·网络·数据库·gateway·prompt·企业级产品
像风一样自由20204 天前
53.NginxAPI-Gateway与鉴权如何保护大模型接口
人工智能·大模型·gateway·智能体
Raas1004 天前
MAI Gateway(魔芋企业级AI网关)能力解析:AI网关能做调用审计吗?AI网关核心功能详解
大数据·网络·人工智能·gateway·ai网关·mai gateway
Raas1005 天前
MAI Gateway(魔芋企业级AI网关)功能全解:AI网关能做Prompt注入防护吗?一文看懂AI网关能力矩阵(v1.2.0)
网络·人工智能·gateway·prompt·mai gateway·企业级ai网关·企业级产品