CORS 跨域是网关的责任,不是业务服务的负担

Spring Cloud Gateway里配了CORS,Swagger还是报Failed to fetch?这3个坑你踩过吗? 本文深入探讨了Spring Cloud Gateway中CORS配置失效的常见问题,特别是Swagger UI报错"Failed to fetch"的解决方案。文章揭示了全局与局部CORS配置的优先级冲突、Swagger UI的特殊性处理以及开发环境与生产环境的差异等三大关键问题,并提供了详细的排查步骤和配置建议,帮助开发者有效解决跨域访问难题。 阅读详情

这是一个非常经典、且在微服务架构中极易被误解的问题。

✅ 你的直觉是对的:不需要在每个业务服务(如 user-service、order-service)中重复配置跨域。


✅ 终极答案:

🚫 不需要在每个业务模块中配置跨域!

✅ 只需要在 API Gateway(网关)中统一配置跨域即可!

你已经在网关层做了跨域配置,这就是最正确、最推荐、最工业级的做法。
在每个业务服务中再配一次,是重复劳动 + 架构反模式,会导致:

  • 配置不一致
  • 维护成本飙升
  • 调试困难
  • 安全风险增加

📌 一、为什么“只在网关配置跨域”是唯一正确做法?

🔍 微服务架构中的请求路径

[前端浏览器]
     ↓ (CORS 请求:GET /user/me)
[API Gateway] ←───────✅【在这里处理 CORS】
     ↓ (转发为内部 HTTP 请求,无 CORS)
[user-service]
     ↓ (返回 JSON)
[API Gateway] ←───────✅【网关将响应头原样返回给前端】
     ↓ (带 Access-Control-* 头)
[前端浏览器] ←───────✅【浏览器收到响应,CORS 检查通过】

✅ 关键原理:CORS 是浏览器行为,不是后端协议

  • CORS(跨域资源共享)是浏览器的安全机制,不是 HTTP 协议的一部分。
  • 浏览器在发起跨域请求前,会先发送一个 OPTIONS 预检请求。
  • 只有网关直接暴露给公网,所以:
    • 只有网关接收来自浏览器的原始请求(含 Origin)
    • 只有网关需要添加 Access-Control-Allow-Origin: https://shop.urbane.io
    • 业务服务(如 user-service)收到的是网关转发的内部请求,Origin 已被移除或伪造,根本不会触发 CORS 检查!

💡 所以:业务服务根本不需要关心 CORS!


❌ 二、如果在业务服务中也配置跨域,会发生什么?

假设你在 user-service 中也写了:

@Configuration
public class WebConfig {
    @Bean
    public CorsWebFilter corsWebFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(Arrays.asList("*"));
        // ... 其他配置
        return new CorsWebFilter(config);
    }
}

⚠️ 后果如下:

问题说明
1. 响应头冲突网关和业务服务都加了 Access-Control-* 头 → 浏览器收到两个相同头,可能拒绝
2. 性能浪费每个请求经过多个 Filter,多一次处理开销
3. 配置不一致网关允许 https://shop.urbane.io,但服务允许 * → 安全策略混乱
4. 调试困难浏览器报错 “Multiple CORS headers”,你不知道是哪个服务搞的鬼
5. 安全漏洞如果某个服务误配 allowedOrigins("*"),等于开放所有网站访问你的私有接口

✅ 实测结果(Chrome DevTools):

Access-Control-Allow-Origin: https://shop.urbane.io   ← 来自网关
Access-Control-Allow-Origin: *                       ← 来自 user-service ❌
→ 浏览器报错:The 'Access-Control-Allow-Origin' header contains multiple values...

✅ 三、正确的架构设计:“CORS 只由网关负责”

✅ 推荐架构图(清晰明了)

[浏览器]
   │
   │ 发起跨域请求:GET /user/me
   │ 带 Origin: https://shop.urbane.io
   ▼
[API Gateway] ←───────────── ✅【唯一处理 CORS 的地方】
   │
   │ 移除 Origin,转为内部请求
   │ 添加 X-Forwarded-For、X-User-ID 等 Header
   ▼
[user-service] ←───────────── ❌【完全不知道跨域,也不该知道】
   │
   │ 返回纯 JSON 数据
   ▼
[API Gateway] ←───────────── ✅【接收响应,原样加上 CORS 头返回给浏览器】
   │
   │ 添加:
   │   Access-Control-Allow-Origin: https://shop.urbane.io
   │   Access-Control-Allow-Credentials: true
   │   Access-Control-Allow-Headers: Authorization, Content-Type
   ▼
[浏览器] ←────────────────── ✅【收到响应,CORS 检查通过,允许访问数据】

✅ 核心思想:

  • 网关是“对外门户”
  • 业务服务是“内部组件”
  • CORS 是边界控制,不是内部逻辑

✅ 四、如何在网关中正确配置跨域?(完整示例)

✅ 在 urbane-commerce-gateway 的 application.yml 中:

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]': # 对所有路径生效
            allowedOrigins: "https://shop.urbane.io" # ✅ 生产环境限定域名
            allowedMethods: "*"
            allowedHeaders: "*"
            allowCredentials: true # ✅ 允许携带 Cookie(JWT)
            maxAge: 3600 # 预检缓存 1 小时

✅ 或者使用 Java 配置(更灵活):

package io.urbane.gateway.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;

import java.util.Arrays;

/**
 * 网关全局跨域配置
 * 功能:
 *   - 允许前端域名访问所有 API
 *   - 支持携带凭证(Cookie / Authorization)
 *   - 缓存预检结果,减少 OPTIONS 请求
 *
 * 注意:
 *   - 不要使用 "*" 作为 allowedOrigins,生产环境必须指定具体域名
 *   - allowCredentials=true 时,allowedOrigins 不能为 "*"
 */
@Configuration
public class CorsConfig {

    @Bean
    public CorsWebFilter corsWebFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(Arrays.asList("https://shop.urbane.io")); // ✅ 生产环境
        config.setAllowedMethods(Arrays.asList("*"));
        config.setAllowedHeaders(Arrays.asList("*"));
        config.setAllowCredentials(true); // 必须开启才能携带 Authorization
        config.setMaxAge(3600L);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }
}

✅ 测试方式:
在浏览器打开开发者工具 → Network → 查看 /user/me 请求:

  • Response Headers 中是否包含:
    Access-Control-Allow-Origin: https://shop.urbane.io
    Access-Control-Allow-Credentials: true
    

✅ 五、如果你坚持要在业务服务中配置(不推荐),怎么办?

如果你因为历史原因、团队习惯、或者用了旧版 Spring Boot(<2.7),非要保留业务服务的跨域配置,请务必:

✅ 强制关闭业务服务的跨域拦截器

// 在每个业务服务中,禁用自动配置
@SpringBootApplication(exclude = {CorsAutoConfiguration.class})
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

✅ 或者,在 application.yml 中关闭:

spring:
  mvc:
    cors:
      enabled: false

✅ 目的:确保只有网关输出 CORS 头,其他服务完全不参与。


✅ 六、企业级最佳实践总结(可打印贴墙上)

原则说明
✅ CORS 只应在网关配置所有外部请求入口都在网关,跨域控制必须集中管理
✅ 业务服务不应感知 CORS业务服务是内部服务,收到的是网关转发的请求,非浏览器直连
✅ 禁止在业务服务中写 @CrossOrigin 注解这是错误示范,会导致头冲突
✅ 生产环境不允许 allowedOrigins("*")必须明确指定前端域名,防 XSS 和 CSRF
✅ 必须开启 allowCredentials: true否则前端无法携带 Authorization: Bearer xxx
✅ 使用 maxAge: 3600 缓存预检减少 OPTIONS 请求,提升性能
✅ 前端只调用网关地址如:https://api.urbane.io/user/me,不要直连 http://user-service:8082

✅ 七、常见误区澄清

误区正解
❌ “我怕网关挂了,业务服务要独立可用”网关是入口,不是可选项;业务服务永远不应该直接暴露给公网
❌ “我的服务是独立部署的,应该自己管 CORS”那就别用微服务!单体应用才这么干
❌ “我用 Feign 调用其他服务,也需要 CORS”❌ 错!Feign 是服务间调用,走内网,没有浏览器,不触发 CORS
❌ “我在 Nginx 做了跨域,就不需要网关配置了”✅ 可以,但建议统一用 Spring Cloud Gateway,便于日志、监控、限流一体化
❌ “我加了 @CrossOrigin 就万事大吉”❌ 你这是在“污染”内部服务,未来一定会出问题

✅ 八、最终建议:立即行动清单

步骤操作
✅ 1删除所有业务服务(user-service、order-service 等)中的 CorsWebFilter、@CrossOrigin、WebMvcConfigurer 跨域配置
✅ 2确保网关中已正确配置 globalcors 或 CorsWebFilter(见上文)
✅ 3重启网关,测试前端能否正常访问 /user/me、/order/list
✅ 4在浏览器开发者工具 Network 标签页,检查响应头是否包含 Access-Control-Allow-Origin
✅ 5通知前端团队:以后所有请求只访问 https://api.yourcompany.com,不要直连任何 service:port
✅ 6把本节内容加入团队《微服务架构规范文档》,作为强制条款

✅ 结语:一句话记住黄金法则

✅ “CORS 是网关的责任,不是业务服务的负担。”

让网关做网关的事 —— 认证、路由、跨域、限流。
让业务服务做业务的事 —— 查询用户、创建订单、扣库存。
分而治之,才是微服务的灵魂。


📦 Bonus:我为你准备了完整配置包

如果你希望我为你提供:

  • ✅ 完整的 gateway 跨域配置文件(YAML + Java 版)
  • ✅ 前端调用示例(Axios + Vue/React)
  • ✅ Postman 测试用例(模拟跨域请求)
  • ✅ Docker Compose 示例(网关 + 用户服务 + 前端)
  • ✅ GitLab CI 检查脚本(禁止业务服务包含 CORS 配置)

👉 请回复:
“请给我完整的网关跨域配置模板包!”

我会立刻发送你一份开箱即用的企业级跨域解决方案包,包含所有代码、注释和测试用例,你只需复制粘贴,即可彻底解决这个问题 💪

Spring Boot项目CORS安全漏洞修复:手写Tomcat过滤器实现精细化跨域控制 跨域资源共享(CORS)是现代Web应用开发中处理跨域请求的核心安全机制。其原理是通过HTTP响应头,由服务器明确告知浏览器哪些外部源被允许访问资源,从而在便利跨域通信的同时,防止恶意网站窃取数据。正确的CORS配置对于保护用户敏感信息、防范CSRF等攻击具有重要技术价值,广泛应用于前后端分离架构、微服务API调用等场景。本文聚焦于CORS配置不当引发的典型安全漏洞,如Origin校验缺失、Credentials与通配符冲突等,并针对Spring Boot + Tomcat技术栈,提供了一套通过自定义过滤器 阅读详情

相关推荐

AI聊天应用落地:从设计、构建到Docker部署的完整工程链路

AI聊天应用本质上是状态驱动的分布式系统,其核心不在模型推理本身,而在于HTTP无状态协议与多轮对话状态管理之间的工程弥合。理解RESTful API网关、Redis会话生命周期、SSE流式传输与vLLM高性能服务协同原理,是保障低延迟、高可用和可维护性的技术基础。这类系统需兼顾安全性(JWT鉴权、速率限制)、可观测性(健康检查、组件探活)与弹性扩展(Docker容器化、服务解耦),广泛应用于智能客服、企业知识助手及嵌入式AI交互场景。本文聚焦真实交付中高频出现的部署失稳、状态丢失与流式中断问题,提供基于F

weixin_34220179的博客 321

软件行业项目经理常见面试题及答案

失业了,找了几个星期的项目管理工作没有音讯,以下是我整理的面试题,有需要的就拿去看看吧。

a342874650的专栏 1502

前后端分离架构:原理、优势与实战优化

前后端分离架构是现代Web开发的核心模式,通过解耦用户界面与业务逻辑实现高效协作。其技术原理基于RESTful API通信,前端专注于视图渲染与交互逻辑(采用React/Vue等框架),后端处理数据业务(使用Spring/Django等框架)。这种架构显著提升了开发效率,支持并行开发和独立部署,同时通过CDN分发、接口缓存等优化手段改善系统性能。在微服务和移动互联网场景下,前后端分离架构展现出极强适应性,既能通过BFF模式对接多端需求,又能结合Node.js中间层实现服务端渲染。企业实践中需重点关注接口规范

weixin_33766805的博客 343

前端工程师的后端与部署能力升级指南

现代前端开发已超越纯界面实现,演变为涵盖本地调试、构建部署、服务集成与生产运维的全链路工程实践。其核心原理在于通过轻量级技术选型(如Vite代理、Node胶水脚本、Docker环境封装、Ollama本地AI服务)建立确定性交付能力。这种能力的技术价值在于降低协作成本、提升上线稳定性、增强个人不可替代性。典型应用场景包括跨域联调、静态资源托管、进程守护部署、以及AI能力内嵌集成。本文聚焦前端角色下的实用技能选型,强调成本收益比与真实落地经验,而非泛泛而谈的后端知识迁移。

weixin_33843947的博客 290

Flask生产部署核心架构:Gunicorn+Nginx实战指南

Web应用部署本质是将开发态代码转化为高可用、可伸缩、安全可控的生产服务。其底层依赖WSGI协议标准与分层网关模型:应用服务器(如Gunicorn)专注Python进程管理与并发处理,反向代理(如Nginx)承担SSL终止、静态资源服务、连接管理及安全加固。这种解耦架构显著提升系统吞吐与稳定性,尤其适用于Flask这类轻量框架——它本身不内置生产级HTTP服务能力,必须借助符合WSGI规范的容器化部署方案。典型应用场景包括前后端分离项目(如Vue+Flask图书管理系统),其中Nginx可同时托管前端静态文

weixin_33725807的博客 439

AI编排实战:MuleSoft+LangChain构建企业级AI集成中枢

AI编排(AI Orchestration)是企业将大语言模型(LLM)深度融入核心业务系统的关键工程范式,其本质并非简单调度AI服务,而是重构跨系统数据流的可信神经中枢。它融合企业集成(Enterprise Integration)能力与AI逻辑抽象,在保障身份认证、字段级安全治理、流程韧性及合规审计的前提下,实现ERP、CRM等异构系统与LangChain等AI框架的职责分离与协同。该方法显著提升AI落地稳定性与可运维性,广泛适用于销售智能、预测性维护、医疗报告生成等强流程、高合规场景。

weixin_34306593的博客 471

工作中使用到的单词(软件开发)

1.エイリアス   alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート   promote 促进,提升   开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................

sun0322 6万+

MuleSoft企业级AI编排:大语言模型集成的生产实践

AI编排(AI Orchestration)是企业将大语言模型(LLMs)安全、稳定、可治理地嵌入现有IT系统的核心能力。它超越简单API调用,聚焦协议适配、流量治理、安全合规与全链路可观测性等工程化挑战。MuleSoft作为成熟的企业级集成平台,凭借DataWeave数据转换、Policy策略引擎和Runtime Fabric运行时治理,天然支撑LLM调用的语义解析、动态脱敏、熔断限流与审计追溯。该方案特别适用于需对接SAP/ERP/CRM等异构系统、满足GDPR/HIPAA等合规要求、且SLA严苛的En

weixin_33713503的博客 433

前端部署避坑指南:从构建、Nginx配置到CI/CD与Docker的完整实践

在现代前端工程中,部署是连接开发与线上环境的最后一公里,也是许多项目从“能跑”到“稳跑”的关键门槛。构建产物如何生成、静态服务器如何托管、资源缓存如何设置、接口跨域如何解决,这些基础能力直接影响用户体验和站点稳定性。从构建链路的资源路径与环境变量,到Nginx中try_files路由回退、缓存策略与反向代理的经典配置,再到通过CI/CD流水线实现自动化发布与回滚,每个环节都有值得深挖的工程细节。理解这些原理,不仅能解决“本地正常线上白屏”的难题,还能为灰度发布与故障监控打下基础。本文结合生产环境验证过的配置

weixin_34290631的博客 368

MCP协议:为OpenClaw与Skills提供标准化上下文通信

在LLM智能体架构中,外部能力调用面临执行层与语义层的割裂——OpenClaw和Skills解决了‘能做什么’的执行问题,但缺乏统一的上下文协商机制。MCP(Model Context Protocol)作为轻量级RFC协议,聚焦于能力调用的语义对齐:通过标准化SSE/WS事件结构、预定义错误码(如INPUT_INVALID)、JSON Schema契约描述及任务生命周期管理,实现跨框架、跨语言的能力互操作。它不替代执行引擎,而是为Skills提供可验证的类型系统,为SSE流注入机器可解析的上下文语义,使A

weixin_30703911的博客 473

Go语言JWT认证实战:从原理到生产级安全实现

在分布式系统和API开发中,身份认证是保障服务安全的核心环节。JWT(JSON Web Token)作为一种基于声明的开放标准,通过自包含的令牌结构实现了无状态认证,其原理是将用户信息与元数据编码并签名,服务端无需会话存储即可验证身份。这一技术为微服务架构和前后端分离应用提供了天然的鉴权方案,有效解决了服务扩展性和状态管理难题。在工程实践中,结合双令牌机制和密钥安全管理,JWT能够平衡用户体验与安全防护,广泛应用于API网关、单点登录和移动端认证等场景。本文基于Go语言生态,深入探讨如何通过golang-j

weixin_34087307的博客 587

即插即用AI记忆中间件:无需改模型,兼容任意LLM

AI记忆能力是大语言模型落地应用的关键基础能力,其本质是将动态上下文持久化、结构化并按需注入推理过程。传统方案如RAG或微调依赖向量数据库、重训模型或深度框架耦合,导致工程复杂度高、延迟不可控、运维成本陡增。本文介绍的轻量级记忆中间件,基于协议层抽象实现OpenAI API兼容,仅通过HTTP/gRPC代理拦截请求,在不修改模型权重、不侵入推理代码的前提下,完成语义提取、SQLite/Redis存储、动态分块与prompt末尾精准注入。它支持Llama 3、Qwen、GPT-4等任意已部署LLM,实测延迟增

weixin_30542079的博客 522

AI如何从代码理解到攻击模拟,智能修复CSRF漏洞

CSRF(跨站请求伪造)是一种经典的Web安全漏洞,攻击者可利用用户已认证的会话执行非授权操作。其防护原理核心在于验证请求的合法性,通常通过同步令牌、同源检测等技术实现。传统手动修复面临覆盖不一致、令牌管理复杂等痛点,而AI技术的介入带来了范式转变。通过深度代码语义理解、上下文建模和智能修复策略生成,AI能系统性识别风险并生成适配的防护代码。结合攻击模拟验证,AI不仅提升了安全修复的效率和一致性,更推动了安全实践左移,使安全防护从被动响应转向主动设计。本文聚焦于AI在CSRF漏洞修复中的实践,探讨其如何从辅

weixin_33863087的博客 398

AI低代码工具赋能中小企业自建CRM系统实战指南

客户关系管理(CRM)系统是企业数字化转型的核心基础设施,通过集中管理客户信息、跟踪销售流程实现业务增长。传统CRM采用SaaS订阅模式,但成本高昂且功能匹配度有限。随着AI编程助手和低代码平台的成熟,企业现在可以利用这些工具快速构建定制化管理系统。AI工具如Cursor、GitHub Copilot通过智能代码生成大幅降低开发门槛,结合React、FastAPI等现代技术栈,中小企业能够以可控成本搭建贴合业务需求的CRM系统。这种技术能力平权重构了企业软件采购逻辑,特别适合20-200人规模、有基本技术团

weixin_33850015的博客 367

Go语言构建安全SCP通信:TLS/HTTP/WebSocket配置全解析

在分布式系统和微服务架构中,服务间安全通信是保障数据完整性与隐私的基石。其核心原理在于建立加密、认证的传输通道,以抵御中间人攻击和数据窃听。TLS(传输层安全协议)作为传输层加密的事实标准,通过证书验证和密钥交换为通信提供机密性与完整性。在应用层,HTTP/HTTPS和WebSocket over TLS(WSS)等协议构建于TLS之上,实现了请求-响应与实时双向通信的安全增强。其技术价值在于通过深度防御策略,将网络层、协议层与应用层安全相结合,构建堪比金融级应用的健壮通信链路。典型的应用场景包括跨服务的文

weixin_34288121的博客 438

【信息科学与工程学】【安全领域】第八十三篇 云安全解决方案02

企业中“搞人”与“搞事情”常见问题的分析框架。我将选取4个典型场景,每个场景都从实际管理现象出发,逐步推导出数学模型、参数设定及关联知识。

weixin_49199313的博客 321

端到端测试实战:从工具选型到CI接入的完整指南

在软件质量保障体系中,自动化测试扮演着越来越重要的角色。单元测试与接口测试验证了模块与接口的正确性,却难以覆盖跨系统的完整业务链路——真实用户场景下,前端、后端、中间件及第三方服务协同工作,问题往往发生在系统边界。端到端测试(E2E)通过模拟用户真实操作,验证从界面到数据库的整条业务价值流,成为保障线上稳定性的关键防线。在工具选型上,Playwright凭借多语言支持、自动等待机制、网络拦截及Trace调试能力,逐渐成为主流选择。结合Page Object模式和CI/CD流水线,团队可以构建高效稳定的E2E

weixin_42545503的博客 270

紫光PG2L100H平台DDR3 IP核调试实战:从AXI接口到状态机设计的避坑指南

本文详细介绍了在紫光PG2L100H FPGA平台上调试DDR3 IP核的实战经验,重点解析了AXI接口的特殊行为和状态机设计的关键技巧。通过具体代码示例和调试方法,帮助开发者规避常见陷阱,实现高性能DDR3控制器设计,达到1.2GB/s的稳定带宽。

weixin_28717969的博客 218

最小权限原则(PoLP)实战指南:从原理到动态权限治理

最小权限原则(PoLP)是零信任架构的核心基石,指系统仅授予主体完成任务所必需的最小权限集,其本质是通过权限的必要性、时效性与上下文唯一性实现风险收敛。它源于操作系统安全设计,现已成为云原生、微服务与SaaS集成场景下的关键治理机制。技术价值在于显著压缩攻击面、提升故障隔离能力、支撑自动化审计与快速熔断。典型应用场景包括IAM策略优化、服务账户管控、临时权限生命周期管理及第三方API访问约束。本文结合真实生产事故与六步落地框架,深入解析如何将PoLP从安全教条转化为可度量、可验证、可生长的工程实践。

weixin_34110749的博客 441

计算机毕设项目十四:美团酒店评论情感分析完整数据代码-可直接运行

计算机毕设项目十四:美团酒店评论情感分析完整数据代码-可直接运行

693

PyQt5开发编译器安装(PyCharm安装)

PyCharm 提供了最完整的 PyQt5 开发体验,特别是其集成的调试工具和 Qt Designer 支持,能显著提高开发效率。是最受欢迎和功能最完整的 IDE。它专门为 Python 开发优化,对 PyQt5 有很好的支持。右键运行该文件,如果出现窗口说明配置成功。对于 PyQt5 开发,

啊渊的专栏 416
上一篇: 5、 auth-service:企业级 OAuth2 第三方登录完整实现
下一篇: 1、Auth-Service 服务设计规范文档
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值