
接下来细化集成Spring Cloud Gateway的步骤,特别是配置路由规则和添加全局过滤器验证JWT Token。现在需要一个更详细的操作指导,方便更容易入手。希望能给大家带来帮助。
新建Spring Boot模块:
gateway-service。
调整父工程结构(若为多模块项目):
<!-- 父工程 pom.xml -->
<modules>
<module>gateway-service</module>
<module>user-service</module> <!-- 示例业务服务 -->
</modules>添加网关配置(application.yml):
server:
port: 8888 # 网关端口
spring:
cloud:
gateway:
routes:
- id: user-service # 路由ID(唯一)
uri: http://localhost:8081 # 目标服务地址(示例用户服务端口8081)
predicates:
- Path=/api/user/** # 匹配路径规则
filters:
- StripPrefix=1 # 移除前缀(/api/user/xxx → /xxx)启动业务服务(示例):
创建一个 user-service 模块,监听端口 8081,并添加一个测试接口:
@RestController
public class UserController {
@GetMapping("/info")
public String info() {
return "User Service Response";
}
}测试路由功能:
gateway-service:8888) 和用户服务 (user-service:8081)。
http://localhost:8888/api/user/info → 应返回 User Service Response。
添加JWT依赖(网关模块的 pom.xml):
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<!-- 其他jjwt依赖同上一步骤 -->创建全局过滤器类:
@Component
public class JwtAuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String path = request.getPath().toString();
// 放行登录接口和其他公开路径
if (path.contains("/auth/login") || path.contains("/public")) {
return chain.filter(exchange);
}
// 获取Token
String token = request.getHeaders().getFirst("Authorization");
if (token == null || !token.startsWith("Bearer ")) {
return unauthorizedResponse(exchange, "Missing Token");
}
token = token.replace("Bearer ", "");
try {
String username = JwtUtils.parseToken(token); // 复用之前步骤的JWT工具类
// 将用户信息传递到下游服务(可选)
exchange.getRequest().mutate()
.header("X-User-Name", username)
.build();
} catch (Exception e) {
return unauthorizedResponse(exchange, "Invalid Token");
}
return chain.filter(exchange);
}
private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().add("Content-Type", "application/json");
String body = "{\"code\": 401, \"message\": \"" + msg + "\"}";
DataBuffer buffer = response.bufferFactory().wrap(body.getBytes());
return response.writeWith(Mono.just(buffer));
}
@Override
public int getOrder() {
return 0; // 过滤器执行顺序(值越小优先级越高)
}
}确保 JwtUtils 密钥一致:
JwtUtils 类复制到网关模块,或封装为公共依赖。
测试未携带Token的请求:
访问 http://localhost:8888/api/user/info → 返回 401 错误:
{ "code": 401, "message": "Missing Token" }测试携带合法Token的请求:
Authorization: Bearer <your_token>。
http://localhost:8888/api/user/info → 返回用户服务响应。
集成Nacos配置中心(以Nacos为例):
添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>配置 bootstrap.yml:
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml在Nacos控制台配置动态路由规则。
跨域处理:
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods: "*"
allowedHeaders: "*"生产环境建议:
通过以上步骤,网关已实现 路由转发 和 JWT鉴权,后续可扩展其他功能(如限流、日志)。
本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注。 后续将继续把后续步骤继续完善,有什么遗漏、或者对什么功能有缺失的可以评论区,指出来,共同成长共同进步。