尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Chat2Excel 项目网关服务开发
一、编写 bootstrap 配置文件spring: application: name: gateway-service main: web-application-type: reactive # 设置为响应式应用类型避免与Spring MVC冲突 # Jackson配置 jackson: date-format: HH:mm:ss time-zone: UTC serialization: write-dates-as-timestamps: false fail-on-empty-beans: false deserialization: fail-on-unknown-properties: false fail-on-null-for-primitives: false accept-empty-string-as-null-object: true accept-single-value-as-array: true # Redis配置 - Gateway 服务使用更长的超时时间 data: redis: host: *** port: 6379 password: *** database: 0 timeout: 10000ms lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: -1ms # Nacos服务发现配置 cloud: nacos: discovery: server-addr: ***:8848 username: nacos password: *** namespace: public enabled: true # 启用 Nacos 服务发现 gateway: # 默认过滤器 default-filters: - DedupeResponseHeaderAccess-Control-Allow-Credentials Access-Control-Allow-Origin # - JwtAuth # 全局跨域配置 globalcors: cors-configurations: [/**]: # 允许跨域的源使用 allowedOriginPatterns 支持通配符和凭证 allowedOriginPatterns: * # 允许跨域的HTTP方法 allowedMethods: - GET - POST - PUT - DELETE - OPTIONS # 允许跨域的请求头 allowedHeaders: * # 允许携带凭证 allowCredentials: true # 跨域预检的有效期单位为秒 maxAge: 3600 # 路由配置 routes: # 用户服务路由 - id: user-service uri: lb://user-service predicates: - Path/api/v1/users/** filters: - StripPrefix2 # 去掉 /api/v1保留后续路径 # 文件服务路由 - id: file-service uri: lb://file-service predicates: - Path/api/v1/files/** filters: - StripPrefix2 # 去掉 /api/v1保留后续路径 # AI服务路由 - llm接口 - id: ai-service-llm uri: lb://ai-service predicates: - Path/api/v1/llm/** filters: - StripPrefix2 # 去掉 /api/v1保留后续路径 # AI服务路由 - ai接口 - id: ai-service-ai uri: lb://ai-service predicates: - Path/api/v1/ai/** filters: - StripPrefix2 # 去掉 /api/v1保留后续路径 # MyBatis Plus公共配置 mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto table-underline: true # 安全配置 - 网关令牌所有服务共享 security: gateway: token: internal-gateway-secret-token-2024 enabled: true # 设置为 false 可以禁用网关检查开发环境 whitelist: - /users/auth - /users/verification-code # 自定义日志配置 logging: pattern: console: %clr(%d{HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){cyan} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx二、创建配置类package com.linzhixin.gateway.config; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * 网关配置类(空路由在bootstrap里面已经配置类路由规则其实这个配置类可以省略) */ Configuration public class GateWayConfig { /** * 自定义路由配置 * param builder RouteLocatorBuilder构造器 * return RouteLocator实例对象 */ Bean public RouteLocator routeLocator(RouteLocatorBuilder builder) { return builder.routes().build(); } }package com.linzhixin.gateway.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; import org.springframework.data.redis.core.ReactiveRedisTemplate; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.StringRedisSerializer; /** * Redis 配置类 * Spring 确实会自动配置但默认序列化方式不友好。这个配置类主要是为了把序列化方式改成 String确保 Redis 数据可读、可共享。 */ Configuration public class RedisConfig { /** * 构建 ReactiveRedisTemplate -》 用于在响应式编程环境中如 Gateway/WebFlux异步操作 Redis。 * param connectionFactory 连接工厂 * return ReactiveRedisTemplate示例对象 */ Bean public ReactiveRedisTemplateString, String reactiveRedisTemplate(ReactiveRedisConnectionFactory connectionFactory) { // 1、序列化 // StringRedisSerializer 是 Spring Data Redis 提供的一个序列化器负责 Java 对象 ↔ Redis 存储格式 的转换。 StringRedisSerializer serializer new StringRedisSerializer(); // 2、创建 builder RedisSerializationContext.RedisSerializationContextBuilderString, String builder RedisSerializationContext.newSerializationContext(); RedisSerializationContextString, String context builder .key(serializer) .value(serializer) .hashKey(serializer) .hashValue(serializer) .build(); return new ReactiveRedisTemplate(connectionFactory, context); } }三、实现令牌过滤器写在 common-service 中package com.linzhixin.common.filter; import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import java.io.IOException; /** * 网关令牌验证过滤器 * GatewayTokenFilter 会作用于所有依赖 common-service 的服务只要这些服务启动时被 Spring 扫描到。 */ Component Slf4j Order(1) public class GatewayTokenFilter implements Filter { /** * 网关令牌 */ Value(${security.gateway.token:}) private String gatewayToken; /** * 是否启用网关令牌(网关控制器) */ Value(${security.gateway.enabled:true}) private boolean gatewayCheckEnable; Override public void init(FilterConfig filterConfig) throws ServletException { if (gatewayCheckEnable) { log.info(网关令牌过滤器已经启动); } else { log.info(允许直接访问后端); } } Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 1、需要请求request HttpServletRequest httpServletRequest (HttpServletRequest) servletRequest; HttpServletResponse httpServletResponse (HttpServletResponse) servletResponse; String path httpServletRequest.getRequestURI(); String method httpServletRequest.getMethod(); // 2、网关控制器做判断 if(!gatewayCheckEnable) { //将请求和响应传递给过滤器链中的下一个过滤器如果已是最后一个过滤器则传递给目标 Servlet/Controller。 filterChain.doFilter(servletRequest, servletResponse); return; } // 3、获取网关令牌 String gatewayToke httpServletRequest.getHeader(X-Gateway-Token); if(gatewayToke null || gatewayToke.isEmpty()) { log.warn(网关令牌为空); unAuthorized(httpServletResponse, 禁止访问); return; } // 4、验证网关令牌 if(!gatewayToke.equals(this.gatewayToken)) { log.warn(网关令牌错误); unAuthorized(httpServletResponse, 禁止访问); return; } log.info(网关令牌验证通过:{} {}, method, path); filterChain.doFilter(httpServletRequest, httpServletResponse); } Override public void destroy() { Filter.super.destroy(); } private void unAuthorized(HttpServletResponse response, String message) { response.setStatus(403); //设置 HTTP 响应的内容类型和字符编码告诉浏览器/客户端我返回的是 JSON 数据用 UTF-8 解码。 response.setContentType(application/json;charsetUTF-8); //用 String.format 把错误码和错误信息动态拼成 JSON 字符串。 // { : JSON 对象开始 // \code\ : 转义双引号 → 表示 JSON 的 key 是 code //:%d 占位符填入整数 String json String.format( {\code\:%d,\message\:\%s\}, 403, message ); try { //获取响应的字符输出流将 JSON 字符串写入响应体发送给客户端。 response.getWriter().write(json); } catch (IOException e) { throw new RuntimeException(e); } } }
RELATED

相关推荐

Rust+Slint 实现圆形变色按钮源码分享

Rust+Slint 实现圆形变色按钮源码分享

RustSlint 实现圆形变色按钮源码分享一、效果展示二、源码分享1、工程结构2、main.rs3、build.rs4、main.slint5、Cargo.toml三、实现原理1、组件架构设计1.1 、分层结构1.2 、属性系统2、水波纹效果实现2.1 、动态尺寸计算2.2、 位置跟踪机制2.3、 渐变颜色设计3、 交互逻辑实…

📅 2026/9/22 10:55:43
IPD各阶段流程_3验证阶段-详细操作流程活动说明

IPD各阶段流程_3验证阶段-详细操作流程活动说明

绑定资源目录: 2024版基于华为IPD与质量管理体系融合的研发质量管理【63页】.pptx IPD-MM流程:市场调研理论与实践方案(62页).pptx IPD与CBB研发技术管理体系【206页】.pptx IPD业务流程体系构建(上).pptx IPD业务流程体系构建(下).pptx IPD业务流程体系构建(中).pptx IPD…

📅 2026/9/23 9:43:04
【动态库调用静态库函数】

【动态库调用静态库函数】

1、静态库如何调用动态库函数? 静态库直接包含动态库的头文件直接调用即可。静态库本身没有动态符号表,它被链进可执行文件(比如 sonia)的时候,这些对动态库的调用会变成可执行文件动态符号表里的未定义符号&#xff…

📅 2026/9/25 1:19:17
MORE NEWS

更多资讯

📰

荆州电工证怎么办实操考试心里没底怕挂科?电子证书怎么拿

荆州电工证怎么办实操考试心里没底怕挂科?电子证书怎么拿 实操考试心里没底怕挂科,这是大多数考生在考前的真实写照。尤其是荆州电工证怎么办的问题,很多人对流程不了解,再加上对电子证书的获取方式不清楚,更是增添了不少焦虑。其实,只要提前准备,了解…

📰

淮北办水电工证怎么考?上岗必备证书报考全攻略

淮北办水电工证怎么考?上岗必备证书报考全攻略 你是不是正在找工作,但发现岗位要求“必须持有特种作业操作证”?别急, 淮北办水电工证 正是你 上岗必备…

📰

荆州电工证怎么办?在哪考才能快速拿到证上岗?

荆州电工证怎么办?在哪考才能快速拿到证上岗? 你是不是正在找电工相关工作,但卡在了没有特种作业证这道门槛上?荆州电工证怎么办?这可能是很多应届工程类毕业生或者刚入行的从业者最头疼的问题。别急,本文就是专门为你准备的,从 在哪考 到 怎么考…

📰

电工证到期在那里换,别被中介坑了,知道在哪考才安心

电工证到期在那里换,别被中介坑了,知道在哪考才安心 你是不是也遇到过这种情况,电工证快到期了,却不知道去哪儿换证?怕被中介骗钱、怕流程太麻烦、怕自己弄不明白,结果拖着拖着就过期了,还影响工作?别急,今天我就从河南本地培训机构的角度,给你讲清…

📰

电工证中级证办理全流程:外省证怎么转?多久拿证?

电工证中级证办理全流程:外省证怎么转?多久拿证? 之前考的证在外省能不能转过来?这个问题我听得太多了,特别是像你这种在南阳初次报考的小伙伴,可能手里拿着外地的证,心里没底。今天我就从头到尾讲清楚, 电工证中级证办理 到底怎么走, 多久拿证…

📰

溪桥小镇电工证值不值得考?实操考试心里没底怕挂科怎么办

溪桥小镇电工证值不值得考?实操考试心里没底怕挂科怎么办 实操考试心里没底怕挂科,这几乎是所有准备考取 溪桥小镇电工证 的学员共同的焦虑。尤其是在高压电工、低压电工这类实操要求极高的岗位上,考试难度和通过率直接影响你的职业发展。那问题来了,…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬