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();
    }
}
相关推荐
weixin_lizhao4 小时前
50天独立打造企业级API网关(二):安全防护体系与弹性设计
java·spring boot·安全·spring cloud·gateway
YJlio9 小时前
OpenClaw v2026.4.9 更新解析:Memory Dreaming、Control UI、安全修复、插件依赖与升级避坑
gateway·memory·自动化运维·版本更新·ai agent·openclaw·dreaming
code_pgf1 天前
openclaw的gateway详解
人工智能·gateway
zx2859634002 天前
Laravel5.x版本革新特性全解析
mysql·gateway·智能路由器
nvd113 天前
企业级全场景 API 网关实践:基于 Kong Hybrid 模式的跨 VPC 部署与 GitOps 治理
gateway·kong
nvd113 天前
深度解析:Kong Hybrid 模式与 KIC (Gateway API) 架构演进与核心异同
架构·gateway·kong
zx2859634003 天前
Laravel10.x重磅升级:核心特性全解析
mysql·gateway·智能路由器
暗夜猎手-大魔王4 天前
转载--AI Agent 架构设计:Gateway 架构设计(OpenClaw、Claude Code、Hermes Agent 对比)
gateway
SarL EMEN4 天前
Gateway Timeout504 网关超时的完美解决方法
gateway
2601_949194265 天前
Gateway Timeout504 网关超时的完美解决方法
gateway