做别人一摸一样的网站犯法吗,网站制作费计入什么科目,宁波网络推广推荐机构,学校官网网页制作一、Spring Cloud Gateway网关的整体架构
Spring Cloud Gateway 是 Spring Cloud 官方推出的网关解决方案#xff0c;旨在替代 Netflix Zuul 1.x。其底层基于 Spring WebFlux Reactor 模型 构建#xff0c;具备响应式、异步非阻塞的高性能特点。
1. 整体架构图 ----------…一、Spring Cloud Gateway网关的整体架构
Spring Cloud Gateway 是 Spring Cloud 官方推出的网关解决方案旨在替代 Netflix Zuul 1.x。其底层基于 Spring WebFlux Reactor 模型 构建具备响应式、异步非阻塞的高性能特点。
1. 整体架构图 -------------Client --- | Netty HTTP | --- Filter Chain --- Route Matching------------- ↓URI Rewrite↓Load Balancer / WebClient↓Target Service2. 核心组件剖析
1. Netty Server底层通信 基于 Spring WebFlux Netty 实现异步非阻塞的请求接入。 Reactor Netty 作为服务器取代 Tomcat使用 NIO 支持高并发处理。 请求通过 HttpServer 接入并封装为 ServerWebExchange 对象。 2. Route路由定义
核心配置单位决定请求的转发目标。
路由配置组成
spring:cloud:gateway:routes:- id: my-routeuri: http://localhost:8081predicates:- Path/api/**filters:- AddRequestHeadertoken, my-token路由核心类 Route: 单个路由对象包含 id、uri、predicate、filter 等信息。 RouteDefinition: YAML 或 Java DSL 中定义的原始配置。 RouteLocator: 路由查找器默认实现是 CachingRouteLocator缓存所有 Route。 3. Predicate断言 用于匹配请求是否符合某个路由。 每个断言是一个实现了 GatewayPredicate 的类底层是 PredicateServerWebExchange。 常见内置断言Path, Method, Header, Host, Query, RemoteAddr 等。
示例
exchange - exchange.getRequest().getURI().getPath().startsWith(/api/)4. Filter过滤器
过滤器链结构 Spring Cloud Gateway 采用 责任链模式 管理所有过滤器。 分为两类 全局过滤器GlobalFilter作用于所有请求如 NettyRoutingFilter, LoadBalancerClientFilter。 局部过滤器GatewayFilter作用于具体的 Route。
核心类 GatewayFilterChain: 核心接口调用 filter(ServerWebExchange, GatewayFilterChain) 方法。 OrderedGatewayFilter: 带排序的过滤器包装类。 FilterDefinition: YAML 中的过滤器配置项。
过滤器执行流程图
Client -- GlobalFilter1 -- GatewayFilterA -- GatewayFilterB -- GlobalFilter2 -- Backend内置过滤器示例 AddRequestHeaderGatewayFilterFactory RewritePathGatewayFilterFactory HystrixGatewayFilterFactorySpring Cloud CircuitBreaker 5. ServerWebExchange上下文封装 封装请求 (ServerHttpRequest) 和响应 (ServerHttpResponse)。 贯穿整个生命周期类似于 Servlet 中的 HttpServletRequest/Response。 6. 转发请求NettyRoutingFilter 或 LoadBalancerClientFilter NettyRoutingFilter: 默认将请求转发给目标 URI。 LoadBalancerClientFilter: 在 URI 为 lb:// 时调用注册中心负载均衡集成 Ribbon、Spring Cloud LoadBalancer。
示例
// 基于 WebClient 发起转发请求WebFlux 非阻塞客户端
webClient.method(request.getMethod()).uri(targetUri).headers(httpHeaders - ...).exchange()3. 执行流程详解
请求处理核心流程
Step 1: Netty 接收请求并生成 ServerWebExchange
Step 2: RouteLocator 匹配路由
Step 3: 断言 Predicate 判断是否命中路由
Step 4: 构造过滤器链全局 路由
Step 5: 执行 GatewayFilterChain
Step 6: 最终由 NettyRoutingFilter 或 LoadBalancerClientFilter 发起转发
Step 7: 响应回传至客户端4. 响应式编程模型核心基础 Spring Cloud Gateway 是基于 Reactor 模型构建响应式、非阻塞、背压友好。 Filter 链通过 Mono.defer(() - filter(...)).then(...) 串联。 所有逻辑必须是非阻塞否则会违背设计初衷导致性能问题。 5. 扩展点
扩展点接口或类说明自定义断言RoutePredicateFactory继承 AbstractRoutePredicateFactory自定义过滤器GatewayFilterFactory继承 AbstractGatewayFilterFactory自定义全局过滤器GlobalFilter直接实现即可动态路由注册实现 RouteDefinitionLocator 接口支持 Nacos、数据库等动态配置自定义负载均衡策略ReactiveLoadBalancerSpring Cloud LoadBalancer 接口 6. 与 Spring 生态集成 注册中心集成通过 Spring Cloud DiscoveryClient LoadBalancerClientFilter 实现服务名解析。 熔断限流结合 Sentinel、Resilience4j、RateLimiter内置 TokenBucket 限流器实现。 链路追踪集成 Sleuth自动注入 TraceId 进入 header。 认证鉴权通过局部或全局过滤器在 Filter 中实现 JWT 校验、权限认证。 7. 性能优势
特性Spring Cloud Gateway 优势异步非阻塞基于 Reactor 模型比 Zuul 1.x 阻塞式性能更优支持服务发现与 Spring Cloud 原生集成灵活可扩展Filter 和 Predicate 都易于扩展强大配置能力基于 YAML/Java DSL 路由配置能力 8. 底层与 Zuul 对比
对比项Spring Cloud GatewayNetflix Zuul 1.x编程模型响应式WebFlux阻塞Servlet性能高并发、低延迟适中路由配置方式灵活支持 PredicateFilter相对单一可扩展性非常强一般
二、深入剖析断言Predicate
Spring Cloud Gateway 中的 断言Predicate 是路由匹配的核心机制之一作用是判断当前请求是否满足条件是否应该命中该路由。断言具备强大的表达能力底层通过组合式 Predicate 实现。 1. 断言Predicate概念简述 本质是 PredicateServerWebExchange判断当前请求上下文是否满足某些规则。 每个路由可以配置多个断言必须全部通过才会命中路由逻辑与关系。 断言通过配置文件或 Java DSL 配置最终转为 RoutePredicateFactory 执行逻辑。 2. 核心断言分类内置 PredicateFactory
Spring Cloud Gateway 提供了丰富的内置断言工厂可扩展。下面按功能分类剖析它们的参数和底层实现 1. Path 断言
功能基于请求路径进行匹配。
配置示例
predicates:- Path/api/v1/**,/admin/**参数解析 接收一个或多个 Ant 风格路径。 支持通配符 * 和 **。 会自动与 Request.Path 比较。
底层类 PathRoutePredicateFactory 实现 apply(Config config) 返回 exchange - pathMatcher.match(pathPattern, requestPath) 2. Method 断言
功能匹配 HTTP 方法。
配置示例
predicates:- MethodGET,POST底层类MethodRoutePredicateFactory
参数说明 枚举形式传入如 GET、POST、PUT、DELETE 等。 会转换为 HttpMethod 比较 exchange.getRequest().getMethod()。 3. Header 断言
功能匹配请求头信息。
配置示例
predicates:- HeaderX-Request-Id, ^[0-9]$参数说明 第一个参数为请求头 key第二个为正则表达式。 正则匹配请求头的值。
底层类HeaderRoutePredicateFactory 4. Query 断言
功能匹配请求 query 参数。
配置示例
predicates:- Queryversion, ^v1$底层类QueryRoutePredicateFactory
说明 key 是 query 参数名。 value 是正则表达式用于匹配参数值。 5. Host 断言
功能匹配请求中的 Host 头部。
配置示例
predicates:- Host**.example.org底层类HostRoutePredicateFactory
说明 支持通配符*.example.org。 实际读取 Host 头部进行匹配。 6. RemoteAddr 断言
功能基于 IP 地址匹配。
配置示例
predicates:- RemoteAddr192.168.1.0/24底层类RemoteAddrRoutePredicateFactory
说明 支持 CIDR 表达式子网匹配。 注意必须配置 X-Forwarded-For 支持或确保 Netty 获取真实 IP。 7. After / Before / Between 断言基于时间
predicates:- After2025-01-01T00:00:0008:00- Before2025-12-31T23:59:5908:00底层类 AfterRoutePredicateFactory BeforeRoutePredicateFactory BetweenRoutePredicateFactory
说明 ISO-8601 时间格式必须包含时区。 匹配当前请求时间是否在设定时间点之前、之后或区间内。 8. Cookie 断言
predicates:- Cookiesession, ^[a-z0-9]$底层类CookieRoutePredicateFactory
说明 断言某个 Cookie 存在并满足正则匹配。 3. Predicate 参数结构
YAML 配置风格
- Namearg1,arg2,arg3内部通过 Spring Boot 自动绑定为 RoutePredicateFactory.Config 子类。
例如
public class HeaderRoutePredicateFactoryextends AbstractRoutePredicateFactoryHeaderConfig {public static class HeaderConfig {private String header;private String regexp;}public PredicateServerWebExchange apply(HeaderConfig config) {return exchange - {ListString values exchange.getRequest().getHeaders().get(config.getHeader());return values ! null values.stream().anyMatch(v - v.matches(config.getRegexp()));};}
}4. 自定义 Predicate 实现
1. 实现类继承方式
继承
public class MyCustomRoutePredicateFactoryextends AbstractRoutePredicateFactoryMyConfig {public PredicateServerWebExchange apply(MyConfig config) {return exchange - {// 自定义判断逻辑return true;};}
}2. 配置方式
predicates:- MyCustomconfigValue1,configValue23. 自动注册
只要类名以 RoutePredicateFactory 结尾Spring 会自动注册。 5. 组合断言多断言逻辑与
predicates:- Path/api/**- MethodGET- HeaderX-Auth-Token, .执行顺序按配置顺序逐一判断全部为 true 才匹配成功。 6. 调试技巧与陷阱
问题类型原因或建议路由不匹配断言顺序中某一个未通过时间断言失败时区不一致或格式错误IP 断言无效网关前有代理建议配置 ForwardedHeaderFilter多参数不生效多个 query/header 应用多个断言条目而不是一个断言多个值正则不匹配注意正则表达式要转义避免 YAML 被错误解析
三、深入剖析过滤器Filter
1. 执行总流程概览
Spring Cloud Gateway 请求生命周期
1. 客户端发起请求
2. Netty 接收请求并封装为 ServerWebExchange
3. RouteLocator 查找所有 Route含断言 Predicate
4. Predicate 执行逐个判断全部通过才命中 Route
5. 构建 GatewayFilterChain全局过滤器 路由过滤器
6. 依序执行过滤器链前置逻辑 → 发起请求转发 → 后置逻辑
7. 收到目标服务响应经过过滤器返回响应2. 断言执行原理与顺序
断言是路由匹配的前置条件执行在过滤器构造 之前
✅ 原理分析 所有 Route 由 RouteLocator 管理比如 CachingRouteLocator。 每个 RouteDefinition 包含一组 PredicateDefinition。 加载时这些断言通过对应的 RoutePredicateFactory 转换为 PredicateServerWebExchange。 网关请求处理器 RoutePredicateHandlerMapping 会将所有路由依次尝试匹配这些 Predicate。
// RoutePredicateHandlerMapping 中的匹配逻辑简化
for (Route route : this.routeLocator.getRoutes()) {if (route.getPredicate().test(exchange)) {return route;}
}✅ 顺序与逻辑 按路由在配置文件中定义的顺序查找。 每个路由内部的多个断言为 AND 逻辑所有断言返回 true 才命中。 匹配成功后立即终止查找执行对应的过滤器链。 3. 过滤器执行原理与顺序
过滤器构成了 真正的处理链所有请求响应的处理均由其决定。
✅ 执行模型 过滤器链使用 责任链模式 构建封装为 GatewayFilterChain。 本质是通过递归调用 filter(exchange, chain) 来串联执行。
public MonoVoid filter(ServerWebExchange exchange) {return filter0(0, exchange);
}private MonoVoid filter0(int index, ServerWebExchange exchange) {if (index filters.size()) {return Mono.empty(); // 结束链}GatewayFilter filter filters.get(index);return filter.filter(exchange, e - filter0(index 1, exchange));
}4. 过滤器类型与排序机制
两类过滤器
类型接口应用范围全局过滤器GlobalFilter所有请求局部过滤器GatewayFilterFactory匹配路由
排序机制统一使用 Spring 的 Ordered 接口 过滤器最终封装为 OrderedGatewayFilter具有 getOrder() 值。 数字越小优先级越高先执行。 默认值参考 NettyRoutingFilter: Ordered.LOWEST_PRECEDENCE最后执行实际转发 LoadBalancerClientFilter: 10150 RemoveRequestHeaderFilter: 1 5. 过滤器执行阶段划分
每个过滤器可以分为两个阶段
阶段方法位置功能说明前置处理filter(exchange, chain) 方法前部逻辑修改请求、日志、校验、安全等后置处理chain.filter(exchange).then(...)记录响应日志、处理响应内容等
示例
public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info(前置逻辑);return chain.filter(exchange).then(Mono.fromRunnable(() - {log.info(后置逻辑);}));
}6. 断言 vs 过滤器的执行顺序对比
执行组件执行阶段是否参与实际请求处理是否可修改请求是否参与响应处理Predicate路由匹配前❌只判断不处理✅间接地❌Filter路由匹配后✅✅✅
✅ 总结顺序
[1] 路由列表加载
[2] Predicate 按序执行判断是否命中所有断言 AND 关系
[3] 命中后构造 GatewayFilterChain全局 路由
[4] 按 Ordered 排序执行 filter责任链递归调用7. 实战示意图
-------------------
| Client Request |
-------------------↓
[RoutePredicateHandlerMapping]↓
[Predicate1] → true
[Predicate2] → true↓ 命中路由↓ 构造 Ordered GatewayFilterChain↓
→ GlobalFilter1 (order1)
→ GatewayFilterA (order5)
→ GatewayFilterB (order10)
→ LoadBalancerClientFilter (order10150)
→ NettyRoutingFilter (orderLOWEST)↓
[发起 HTTP 请求]↓
[响应处理 → 倒序执行后置逻辑]8. 调试建议
目的调试方式查看是否匹配路由打印路由断言执行日志或开启 debug 日志查看过滤器执行顺序自定义过滤器实现 Ordered打日志确认链执行顺序排查过滤器不生效检查是否被早期过滤器 short-circuit 或未加到 route 中 9. 补充Spring Gateway 源码关键类
功能类名路由匹配RoutePredicateHandlerMapping断言执行AbstractRoutePredicateFactory 子类路由构建RouteLocator, CachingRouteLocator全局过滤器GlobalFilter 接口路由过滤器GatewayFilterFactory, GatewayFilter过滤器执行链GatewayFilterChain, OrderedGatewayFilter
四、自定义断言和过滤器的实现 1. 自定义断言Route Predicate
1️⃣ 断言作用
断言用于匹配路由规则只有当断言通过时路由才会被选中。 2️⃣ 实现步骤
Step 1创建断言工厂类
必须继承
AbstractRoutePredicateFactoryYourConfig示例只有在早上9点后才允许路由生效
Component
public class TimeAfterRoutePredicateFactory extends AbstractRoutePredicateFactoryTimeAfterRoutePredicateFactory.Config {public TimeAfterRoutePredicateFactory() {super(Config.class);}public static class Config {private LocalTime after;public LocalTime getAfter() { return after; }public void setAfter(LocalTime after) { this.after after; }}Overridepublic PredicateServerWebExchange apply(Config config) {return exchange - {LocalTime now LocalTime.now();return now.isAfter(config.getAfter());};}// 可选用于 YAML 参数绑定顺序Overridepublic ListString shortcutFieldOrder() {return List.of(after);}
}3️⃣ 使用配置方式
在 application.yml 中
spring:cloud:gateway:routes:- id: time-limited-routeuri: http://localhost:8081predicates:- Path/time/**- TimeAfter09:00:00⚠️ 注意 TimeAfter 对应的是工厂类名去掉 RoutePredicateFactory 后的部分。 参数顺序来自 shortcutFieldOrder() 方法。 2. 自定义过滤器GatewayFilter
1️⃣ 过滤器作用
用于增强请求处理逻辑鉴权、日志、限流、重写路径、头部处理等。 2️⃣ 实现步骤
Step 1创建过滤器工厂类
继承
AbstractGatewayFilterFactoryYourConfig示例记录请求日志
Component
public class LogGatewayFilterFactory extends AbstractGatewayFilterFactoryLogGatewayFilterFactory.Config {public LogGatewayFilterFactory() {super(Config.class);}public static class Config {private String baseMessage;private boolean preLogger;private boolean postLogger;// Getter/Setter}Overridepublic ListString shortcutFieldOrder() {return List.of(baseMessage, preLogger, postLogger);}Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) - {if (config.preLogger) {System.out.println([PRE] config.baseMessage 请求路径: exchange.getRequest().getURI());}return chain.filter(exchange).then(Mono.fromRunnable(() - {if (config.postLogger) {System.out.println([POST] 响应码: exchange.getResponse().getStatusCode());}}));};}
}3️⃣ 使用配置方式
在 application.yml 中
spring:cloud:gateway:routes:- id: log-filter-routeuri: http://localhost:8081predicates:- Path/log/**filters:- Log访问日志,true,true解释 Log 对应类名 LogGatewayFilterFactory 配置参数顺序由 shortcutFieldOrder 决定 3. 执行顺序说明 路由 → Predicate 判断是否命中 → 构建 GatewayFilterChain GatewayFilterChain 按 Ordered 顺序执行 自定义过滤器可以通过实现 OrderedGatewayFilter 指定优先级
示例设置顺序
return new OrderedGatewayFilter((exchange, chain) - {// filter logic
}, 10); // 优先级为 104. 调试技巧
目的方法确认断言是否生效在断言中加日志打印 / 使用 Spring Boot DevTools确认过滤器执行顺序打印日志 设置 Ordered 显式顺序参数绑定失败检查 shortcutFieldOrder() 参数名一致性多个过滤器调试用不同前缀标识并组合多个过滤器调试执行链 5. 小结对比
维度断言Predicate过滤器Filter用途路由选择条件请求/响应增强逻辑执行时机在请求处理链构建之前在请求处理链中间扩展方式继承 AbstractRoutePredicateFactory继承 AbstractGatewayFilterFactory配置方式predicates: - CustomNameval1,...filters: - CustomNameval1,...控制顺序不支持顺序控制都是 AND支持顺序需使用 OrderedGatewayFilter示例用途限定时间、Header、Method、IP 白名单等鉴权、加解密、日志记录、限流、路径重写、CORS 等等
五、自定义过滤器断言组合成拦截器链 1. 核心理念拦截器链的行为建模
在 Gateway 中
拦截器功能对应概念特点匹配请求断言Predicate用于路由匹配条件匹配失败就跳过拦截处理过滤器GatewayFilter支持链式处理、前置、后置逻辑
它们组合使用时形成如下拦截流程
客户端请求↓
全局过滤器GlobalFilter↓
断言1 → 不满足则跳过当前Route
断言2 → 不满足则跳过当前Route
...
满足所有断言命中路由↓
GatewayFilter1 → GatewayFilter2 → ...↓
目标服务URI↓
响应时倒序执行后置逻辑2. 自定义断言 自定义过滤器组合示例
目标只允许在上午时间段访问 /secure/** 接口并打印日志、添加请求头。 1️⃣ 自定义断言TimeRangeRoutePredicateFactory
Component
public class TimeRangeRoutePredicateFactory extends AbstractRoutePredicateFactoryTimeRangeRoutePredicateFactory.Config {public TimeRangeRoutePredicateFactory() {super(Config.class);}public static class Config {private LocalTime from;private LocalTime to;public LocalTime getFrom() { return from; }public void setFrom(LocalTime from) { this.from from; }public LocalTime getTo() { return to; }public void setTo(LocalTime to) { this.to to; }}Overridepublic PredicateServerWebExchange apply(Config config) {return exchange - {LocalTime now LocalTime.now();return now.isAfter(config.getFrom()) now.isBefore(config.getTo());};}Overridepublic ListString shortcutFieldOrder() {return List.of(from, to);}
}2️⃣ 自定义过滤器AddHeaderAndLogGatewayFilterFactory
Component
public class AddHeaderAndLogGatewayFilterFactory extends AbstractGatewayFilterFactoryAddHeaderAndLogGatewayFilterFactory.Config {public AddHeaderAndLogGatewayFilterFactory() {super(Config.class);}public static class Config {private String headerName;private String headerValue;}Overridepublic ListString shortcutFieldOrder() {return List.of(headerName, headerValue);}Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) - {System.out.println([前置] 添加Header: config.headerName);exchange.getRequest().mutate().header(config.headerName, config.headerValue).build();return chain.filter(exchange).then(Mono.fromRunnable(() - System.out.println([后置] 响应完成)));};}
}3️⃣ 配置使用application.yml
spring:cloud:gateway:routes:- id: secure-routeuri: http://localhost:8081predicates:- Path/secure/**- TimeRange08:00,12:00filters:- AddHeaderAndLogX-Request-Source,Gateway3. 执行流程图拦截器链建模
请求 /secure/hello↓
断言 Path/secure/** ✔
断言 TimeRange08:00-12:00 ✔↓
执行过滤器链- AddHeaderAndLog 前置日志 添加请求头- 请求转发- AddHeaderAndLog 后置日志↓
目标服务响应4. 高阶扩展建议
功能需求处理方式多条件断言组合自定义组合 Predicate 实现或多个 predicate 同时配置动态参数过滤支持 SpEL 或读取配置中心值拦截 鉴权 路由打标将断言 Filter Header 添加等组合构成完整网关管控链多个过滤器组合顺序控制new OrderedGatewayFilter(filter, order) 明确顺序 5. 小结
模块功能说明组合效果断言判断请求是否应被处理路由条件拦截器链头部条件筛选过滤器对匹配的请求执行前后处理逻辑拦截器链的核心执行流程组合条件满足 → 执行链式请求增强类似 Spring MVC 的拦截器链 六、实现基于 Token 的认证逻辑
在 Spring Cloud Gateway 中实现基于 Token 的认证逻辑核心思路是 使用**自定义过滤器GatewayFilter**对请求进行拦截提取 Token → 验签/解析 → 决定是否放行。
场景目标 网关层实现对所有请求的 Token 验证校验失败直接返回 401无需进入下游服务。 1. 技术选型 ✅ 使用 JWTJSON Web Token 作为 Token 格式 ✅ 自定义 GatewayFilter 拦截请求校验 JWT 合法性 ✅ 校验通过 → 继续路由 ✅ 校验失败 → 返回统一错误响应 2. Token 示例JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiJ1c2VyMSIsImlhdCI6MTY5MjAwMDAwMCwiZXhwIjoxNjkyMDAzNjAwfQ.
Nf8cnRku7k7lDghnK8kluhXbZ1bIsvPrKjD7v4-HqDU3. 自定义 Token 过滤器实现 1. JWT 工具类可使用 jjwt
public class JwtUtil {private static final String SECRET_KEY my-secret;public static Claims parseToken(String token) throws JwtException {return Jwts.parser().setSigningKey(SECRET_KEY.getBytes(StandardCharsets.UTF_8)).parseClaimsJws(token).getBody();}
}2. 自定义过滤器 TokenAuthGatewayFilterFactory
Component
public class TokenAuthGatewayFilterFactory extends AbstractGatewayFilterFactoryTokenAuthGatewayFilterFactory.Config {public TokenAuthGatewayFilterFactory() {super(Config.class);}public static class Config {private boolean enabled;}Overridepublic ListString shortcutFieldOrder() {return List.of(enabled);}Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) - {if (!config.enabled) {return chain.filter(exchange);}ServerHttpRequest request exchange.getRequest();String token request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);if (token null || !token.startsWith(Bearer )) {return unauthorized(exchange, Token missing or malformed);}try {Claims claims JwtUtil.parseToken(token.replace(Bearer , ));// 可将用户信息写入 Header 或请求属性中request exchange.getRequest().mutate().header(X-User-Id, claims.getSubject()).build();return chain.filter(exchange.mutate().request(request).build());} catch (JwtException e) {return unauthorized(exchange, Token invalid: e.getMessage());}};}private MonoVoid unauthorized(ServerWebExchange exchange, String message) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);byte[] bytes ({\error\: \ message \}).getBytes(StandardCharsets.UTF_8);return exchange.getResponse().writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap(bytes)));}
}4. 配置使用示例 application.yml
spring:cloud:gateway:routes:- id: secure-apiuri: http://localhost:8081predicates:- Path/secure/**filters:- TokenAuthtrue5. 认证流程图
请求 /secure/hello→ 进入 Gateway→ 匹配断言 Path/secure/**→ 执行过滤器 TokenAuth→ 从 Header 中提取 Bearer Token→ 校验签名 有效期→ 失败返回 401→ 成功添加用户信息继续路由→ 路由到后端服务6. Token 认证增强建议可选
需求实现建议白名单路径免认证配置 if 条件跳过部分 Path支持 Redis Token 存储Token 可存 Redis 校验时检查有效性如登出或禁用支持权限角色检查claims 中附带 roles → 写入 Header → 后端根据角色判定权限动态开关鉴权application.yml 配置 flag 或使用 Nacos 动态刷新统一异常处理 返回结构配合 GlobalFilter 实现通用异常响应包装逻辑 7. 测试示例
curl -H Authorization: Bearer your-token http://localhost:8080/secure/hello8. 依赖库参考
在 pom.xml 中添加
dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion0.9.1/version
/dependency9. 小结
项目实现组件鉴权入口自定义 GatewayFilterToken 格式JWT签名加密后传递鉴权失败响应自定义 401 输出用户透传将用户信息加入 header 传递下游可组合性可与断言组合使用形成安全控制链