You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vaadin 14调用getAddress()始终返回127.0.0.1,如何获取浏览器真实IP?

问题根因

你调用UI.getCurrent().getSession().getBrowser().getAddress()始终返回127.0.0.1,是因为Tomcat前端配置了反向代理(如Nginx、Apache、内网负载均衡设备):客户端请求先发送到代理服务,再由代理转发到Tomcat进程,此时Tomcat默认读取的TCP源IP是代理服务的本地地址,Vaadin的IP获取方法直接读取该值,因此返回127.0.0.1而非真实客户端IP。

解决方案

方案1:配置Tomcat自动识别真实IP(无需修改业务代码,更推荐)

修改Tomcat安装目录下conf/server.xml配置文件,在<Host>节点内添加RemoteIpValve配置:

<Valve className="org.apache.catalina.valves.RemoteIpValve"
       remoteIpHeader="X-Forwarded-For"
       protocolHeader="X-Forwarded-Proto"
       internalProxies="127\.0\.0\.1" />

配置说明:

  • remoteIpHeader指定了代理传递真实客户端IP的请求头,主流反向代理默认都会携带X-Forwarded-For头
  • internalProxies填写你的反向代理服务的IP正则,如果只有本地代理保留默认的127\.0\.0\.1即可,多层代理场景需要把所有中间代理的IP都加入配置
    配置完成重启Tomcat后,你原来使用的UI.getCurrent().getSession().getBrowser().getAddress()方法就可以直接返回真实客户端IP,无需修改业务代码。

方案2:手动从请求头解析IP(无需修改Tomcat配置,兜底方案)

如果不方便调整Tomcat配置,可以直接在Vaadin代码中手动解析请求头获取真实IP,示例代码如下:

// 获取当前请求的HttpServletRequest对象
VaadinRequest vaadinRequest = VaadinRequest.getCurrent();
HttpServletRequest httpRequest = (HttpServletRequest) vaadinRequest;

String clientIp = null;
// 按优先级读取常见代理转发IP头
String[] headerNames = {
    "X-Forwarded-For",
    "Proxy-Client-IP",
    "WL-Proxy-Client-IP",
    "HTTP_CLIENT_IP",
    "HTTP_X_FORWARDED_FOR"
};
for (String header : headerNames) {
    String ip = httpRequest.getHeader(header);
    if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
        clientIp = ip;
        break;
    }
}
// 兜底读取原始TCP源IP
if (clientIp == null) {
    clientIp = httpRequest.getRemoteAddr();
}
// 多级代理场景下X-Forwarded-For会返回逗号分隔的IP列表,第一个就是真实客户端IP
if (clientIp.contains(",")) {
    clientIp = clientIp.split(",")[0].trim();
}
注意事项
  • 如果你的环境没有配置反向代理,直接暴露Tomcat对外提供服务,出现该问题可能是因为你在服务器本地访问测试,换同局域网的其他设备访问即可拿到192.168段的真实内网IP
  • 生产环境如果存在多层反向代理,需要确保所有中间代理都配置了传递X-Forwarded-For头,避免无法获取到真实客户端IP

内容的提问来源于stack exchange,提问作者user15905221

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:24:03