feat:first commit gateway

This commit is contained in:
xiang
2025-09-05 23:21:19 +08:00
parent ed7c233625
commit 014b3edf88
8 changed files with 266 additions and 5 deletions

View File

@@ -0,0 +1,59 @@
package com.xiang.xservice.gateway.service.core;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Slf4j
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String path = request.getURI().getPath();
// 放行 /public/** 和 /login
if (path.contains("/public/") || path.contains("/login")) {
log.debug("跳过 Token 校验: {}", path);
return chain.filter(exchange);
}
// 获取 Header 中的 Authorization
String token = request.getHeaders().getFirst("Authorization");
if (!StringUtils.hasText(token)) {
log.warn("❌ 缺少 Token: {}", path);
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
try {
// TODO: 这里换成你自己的 JwtUtil.verify(token)
// boolean valid = JwtUtil.verify(token);
if (false) {
log.warn("❌ Token 校验失败: {}", token);
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
} catch (Exception e) {
log.error("❌ Token 校验异常", e);
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
log.info("✅ Token 校验通过: {}", token);
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -1;
}
}

View File

@@ -0,0 +1,42 @@
package com.xiang.xservice.gateway.service.core;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.route.Route;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.net.InetSocketAddress;
@Slf4j
@Component
public class LoggerGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("🌐 Gateway 请求进入, 原始请求路径:{}", exchange.getRequest().getURI().getPath());
ServerHttpRequest request = exchange.getRequest();
InetSocketAddress remoteAddress = request.getRemoteAddress();
log.info("请求路径: {} | 方法: {} | 来源: {} | 匹配到路由:{}, 转发目标地址:{}",
request.getURI(),
request.getMethod(),
remoteAddress != null ? remoteAddress.getHostString() : "unknown",
exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR),
exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR));
// 继续执行过滤链
return chain.filter(exchange)
.then(Mono.fromRunnable(() -> {
log.info("响应状态: {}", exchange.getResponse().getStatusCode());
}));
}
@Override
public int getOrder() {
return 0;
}
}