GateWay具体的使用之全局token过滤器

1: 创建过滤器类

首先,你需要创建一个实现了GatewayFilter接口或者继承AbstractGatewayFilterFactory类的过滤器类。这里以实现GatewayFilter接口为例,创建一个全局token过滤器。

java 复制代码
package com.by.filter;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.jwt.JWTValidator;
import cn.hutool.jwt.signers.JWTSignerUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.net.URI;
import java.util.List;


@Slf4j
//@Component
public class TokenFilter implements GlobalFilter {
    @Value("${cn.loong.tokenx.key}")
    private String tokenKey;

    private static List<String> whiteList = CollUtil.newArrayList("/api/login", "/api/register");

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

        ServerHttpRequest request = exchange.getRequest();
        URI uri = request.getURI();
        String path = uri.getPath().toLowerCase().trim();
        //排除白名单的验证
        if(whiteList.contains(path)){
            return chain.filter(exchange);
        }
        ServerHttpResponse response = exchange.getResponse();
        // 获取请求头
        List<String> tokens = request.getHeaders().get("token");
        // 判断是否传了token
        if(ObjectUtil.isEmpty(tokens)){
            log.error("token为空,请传token");
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }
        String token = tokens.get(0);
        // 判断token是否合法
        if (ObjectUtil.isEmpty(token)){
            log.error("token不能为空");
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }
        boolean b = false;
        //判断token是否有效
        // 验证算法  包含过期时间
        try {
            JWTValidator.of(token).validateAlgorithm(JWTSignerUtil.hs256(tokenKey.getBytes())).validateDate();
            b = true;
        }catch (Exception e){
            e.printStackTrace();
            log.error("token无效");
        }
        if (!b){
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }
        // 放行
        return chain.filter(exchange);
    }
}

2: 注册全局过滤器

为了让Spring Cloud Gateway应用识别并使用这个过滤器,你通常需要在配置类中注册它。但是,由于我们使用了@Component注解,Spring会自动扫描并注册该Bean。

使用@Component或下面代码,二选一。

java 复制代码
@Configuration
public class FilterConfig {
 
    @Bean
    public TokenFilter tokenFilter() {
        return new TokenFilter();
    }
}
相关推荐
江畔何人初8 小时前
Gateway API 的核心组件与作用
运维·网络·云原生·kubernetes·gateway
zklgin10 小时前
Gateway Timeout504 网关超时的完美解决方法
gateway
WwW.-.2 天前
OpenClaw 技术解析:多渠道 AI Gateway 如何连接消息、Agent 与远程节点
网络·人工智能·gateway
@小匠2 天前
Spring-Gateway-理论知识总结/常问面试题
数据库·spring·gateway
胡斌附体2 天前
OpenClaw Gateway 代理问题排查记录
gateway·proxy·openclaw
大傻^3 天前
【OpenClaw -04】OpenClaw Gateway 架构:单一控制平面与 Agent 运行时模型
gateway·mcp·openclaw
坐吃山猪16 天前
OpenClaw04_Gateway常见问题
网络·gateway·openclaw
三水不滴16 天前
利用SpringCloud Gateway 重试 + 降级解决第三方接口频繁超时问题,提升性能
经验分享·笔记·后端·spring·spring cloud·gateway
知识即是力量ol17 天前
微服务架构:从入门到进阶完全指南
java·spring cloud·微服务·nacos·架构·gateway·feign
j2001032217 天前
Gateway—— 高级流量路由
gateway·k8s