SpringCloud使用Nginx代理、Gateway网关以后如何获取用户的真实ip

前言

本文转载自: www.microblog.store,且已获得授权.

一、需求背景

微服务架构使用了Nginx代理转发、并且使用了SpringCloud的Gateway统一控制所有请求,现在有个需求: 做一个日子记录切面,需要记录用户请求的ip地址

在上述双重背景下,通过普通的方法获取用户ip地址是不可行的,只能获取到引用部署所在服务器的内网地址,必须要做一系列的设置以后才能正确获取到响应的地址。

二、解决办法

2.1 Nginx设置

css 复制代码
  location / { 
      root /opt/xxx/xxx-auth; 
      index  index.html index.htm; 
      try_files $uri $uri/ /index.html; 
      
     # 获取用户请求ip
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;  #获取客户端真实IP
      proxy_set_header REMOTE-HOST $remote_addr;
  }

2.2 gateway网关设置

java 复制代码
@Component
@Log4j2
public class AuthenticationFilter implements GlobalFilter, Ordered {
    /**
     * 验证请求头是否带有Authentication
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        String path = request.getPath().pathWithinApplication().value();

        Optional.of(exchange.getRequest()).ifPresent(item -> {
            // 获取客户端IP地址
            List<String> xForwardedFor = item.getHeaders().get("x-forwarded-for");
            List<String> xRealIp = item.getHeaders().get("x-real-ip");
            List<String> remoteHost = item.getHeaders().get("remote-host");
            response.getHeaders().add("X-Forwarded-For", (xForwardedFor == null || xForwardedFor.isEmpty()) ? "" :
                    xForwardedFor.get(0));
            response.getHeaders().add("X-Real-IP", (xRealIp == null || xRealIp.isEmpty()) ? "" : xRealIp.get(0));
            response.getHeaders().add("Remote-Host", (remoteHost == null || remoteHost.isEmpty()) ? "" :
                    remoteHost.get(0));
        });

        //身份认证等等....
        
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

通过上述设置以后,我们就能正常在request请求头中获取相关信息了。

相关推荐
qq_264220896 小时前
Nginx优化与 SSL/TLS配置
运维·nginx
matlab的学徒9 小时前
Web与Nginx网站服务(改)
linux·运维·前端·nginx·tomcat
邂逅星河浪漫13 小时前
【Docker+Nginx+Ollama】前后端分离式项目部署(传统打包方式)
java·nginx·docker·部署
IT成长日记17 小时前
【Nginx开荒攻略】Nginx主配置文件结构与核心模块详解:从0到1掌握nginx.conf:
linux·运维·nginx·配置文件
疯狂的维修18 小时前
关于Gateway configration studio软件配置网关
网络协议·c#·自动化·gateway
hadage23319 小时前
--- 统一请求入口 Gateway ---
gateway
ZzzZZzzzZZZzzzz…20 小时前
Nginx_Tomcat综合案例
运维·nginx·tomcat·负载均衡·rhce·反向代理·https加密服务
VueVirtuoso1 天前
SaaS 建站从 0 到 1 教程:Vue 动态域名 + 后端子域名管理 + Nginx 配置
前端·vue.js·nginx
007php0072 天前
Redis高级面试题解析:深入理解Redis的工作原理与优化策略
java·开发语言·redis·nginx·缓存·面试·职场和发展
Xxtaoaooo2 天前
Nginx 502 网关错误:upstream 超时配置的踩坑与优化
运维·nginx·负载均衡·502错误·upstream超时