【发布时间】:2014-10-27 01:58:18
【问题描述】:
我在 Tomcat 6.0 上部署了我的 Web 应用程序,机器的 IP 地址为 10.xx.xx.90。然后我从具有 ip 地址 (10.xx.xx.56) 的 m/c 向这个应用程序发出 http 请求(来自浏览器)。
我正在尝试使用以下代码在我的应用程序中获取客户端 (10.xx.xx.56) 的 IP 地址。但是我得到了 request.getHeader("X-FORWARDED-FOR") 的空值,其中 request.getRemoteAddr() 返回部署应用程序的机器的 IP 地址,即 10.xx.xx.90。
但是,如果我从独立的 java 程序对应用程序进行 http 调用,我可以获取客户端 m/c ip 地址。那么,获取客户端IP地址的正确方法是什么。我需要在我的 tomcat 中配置一些东西吗??
String ipAddress = request.getHeader("X-FORWARDED-FOR");
if (ipAddress == null) {
ipAddress = request.getRemoteAddr();
}
【问题讨论】:
-
你怎么知道
ipAddress在request.getHeader("X-FORWARDED-FOR")之后为空?您是登录还是只是猜测?request.getRemoteAddr()将返回客户端的 IP,而request.getHeader("X-FORWARDED-FOR")将返回所有 IP(包括代理)。所以你可能会从request.getHeader("X-FORWARDED-FOR") -
@pmp 我正在记录 ip 地址值并在 request.getHeader("X-FORWARDED-FOR") 的日志中获取空值。调试时也会在本地获取空值。
-
在TOMCAT之前有没有代理服务器或者负载均衡器?
-
@kasharma:这里没有负载均衡器,但我不知道代理服务器。如何检查是否有代理服务器?
-
假设 tomact 服务器 ip 是 (X.Y.Z) 和代理服务器 ip 是 (P.Q.R) 如果您从浏览器直接制作 X.Y.Z/your_app/,that 意味着两者之间没有代理。如果您没有直接访问服务器并且它正在通过如下P.Q.R/proxy --> X.Y.Z/your_app 进行路由,这就是代理的工作原理,我向您提出了这个问题,因为代理服务器可能会修改x-forwarded-for 标头。
标签: java tomcat jakarta-ee networking ip