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();
            }
        };
    }

}

证明参数注入成功

相关推荐
苏渡苇5 小时前
Spring Cloud Gateway 网关限流
spring cloud·gateway·springboot·网关限流
一个儒雅随和的男子1 天前
Spring cloud组件gateway网关详细剖析
spring·spring cloud·gateway
超梦dasgg1 天前
Gateway 鉴权场景:网关统一鉴权 + 业务应用决定放行规则
java·gateway
木雷坞1 天前
AI Gateway 接入大模型服务后首 token 慢排查:镜像、模型缓存和 GPU 节点
人工智能·缓存·gateway
明夜之约2 天前
Spring Cloud Gateway 深度解析:从路由原理到生产级网关实战
java·spring·spring cloud·gateway
tyler_download3 天前
深入深出openclaw:gateway 服务进程的启动逻辑
gateway
Upsy-Daisy3 天前
OpenClaw 源码解析(七):Gateway 控制平面与 WebSocket RPC 机制
websocket·平面·gateway
香菜烤面包3 天前
SGLang Model Gateway 核心功能解析
gateway
a752066286 天前
Windows 11运行OpenClaw(小龙虾)完整指南:从下载到Gateway在线
人工智能·windows·gateway·小龙虾·ai 办公自动化·小龙虾一键部署
阿里-于怀8 天前
告别 Ingress Nginx:云原生 API 网关 Gateway API 使用指引
nginx·云原生·gateway