在Spring Cloud使用Nginx代理后端的Gateway网关时,默认情况下,Nginx会将请求代理给Gateway服务,并且可能会隐藏用户的真实IP。为了让Gateway能够获取用户的真实IP地址,需要配置Nginx以及Gateway服务。
- 配置Nginx,在
nginx.conf
或对应的server块中,添加以下配置:
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_pass http://your_gateway_backend;
}
这里的关键是X-Real-IP
和X-Forwarded-For
头,它们会将用户的真实IP传递给Gateway。
- 在Spring Cloud Gateway中,可以通过添加一个过滤器来获取这些头部信息,并将其放入请求的元数据中,以便后续的过滤器或路由可以使用它们。
@Bean
public GatewayFilter xForwardedHeadersFilter() {
return (exchange, chain) -> chain.filter(exchange)
.then(Mono.fromRunnable(() -> {
ServerHttpRequest request = exchange.getRequest();
HttpHeaders headers = request.getHeaders();
String realIp = headers.getFirst("X-Real-IP");
String forwardedFor = headers.getFirst("X-Forwarded-For");
// 如果有多个IP,通常X-Forwarded-For的格式是"ip1, ip2, ..."
if (realIp != null) {
log.info("Real IP: " + realIp);
}
if (forwardedFor != null) {
log.info("Forwarded For: " + forwardedFor);
}
// 可以将这些信息放入请求的元数据中,供后续逻辑使用
// exchange.getAttributes().put("X-Real-IP", realIp);
// exchange.getAttributes().put("X-Forwarded-For", forwardedFor);
}));
}
在上面的代码中,我们定义了一个名为xForwardedHeadersFilter
的GatewayFilter,它会从请求头中提取X-Real-IP
和X-Forwarded-For
,并记录它们。然后可以将它们放入请求的元数据中,或者根据需求进行其他处理。
- 将过滤器应用到路由中:
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("my_route", r -> r.path("/mypath/**")
.filters(f -> f.filter(xForwardedHeadersFilter()))
.uri("http://myservice"))
.build();
}
在这个例子中,我们定义了一个名为my_route
的路由,并将我们之前定义的