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

}

证明参数注入成功

相关推荐
牛角上的男孩10 小时前
Istio Gateway发布服务
云原生·gateway·istio
柳叶寒2 天前
医院信息化与智能化系统(17)
java·nacos·gateway·全栈·项目
cyt涛3 天前
SpringCloudGateway — 网关路由
java·开发语言·网关·gateway·路由·断言·转发
代码魔法师Sunny5 天前
502 Bad Gateway 错误详解:从表现推测原因,逐步排查直至解决
gateway
RedCong6 天前
通过route访问Openshift上的HTTP request报错504 Gateway Time-out【已解决】
http·gateway·openshift
飞升不如收破烂~6 天前
包括 Nginx、Gateway、Nacos、Dubbo、Sentinel、RocketMQ 和 Seata 的调用链路描述:
nginx·gateway·dubbo
还是转转6 天前
Kong Gateway 指南
gateway·kong
攒了一袋星辰12 天前
微服务网关gateway过滤器工厂与自定义过滤器
微服务·架构·gateway
猫猫不是喵喵.12 天前
Gateway 统一网关
java·网络·微服务·gateway
13 天前
504 Gateway Time-outopenresty
gateway