从servlet请求java获取客户端IP地址

时间:2015-01-06 15:42:07

标签: java jsp servlets ip load-balancing

我有很多tomcat服务器,它们运行相同的JSP应用程序和负载均衡器。我想知道客户端请求从哪个IP地址。我正在使用此代码:

String ipAddress = request.getHeader("X-FORWARDED-FOR");
        if (ipAddress == null) {
            ipAddress = request.getRemoteAddr();
        }

代码request.getHeader("X-FORWARDED-FOR")始终为null,request.getRemoteAddr()始终从不同的客户端计算机返回相同的IP地址。有什么问题?

2 个答案:

答案 0 :(得分:3)

你说,request.getHeader("X-FORWARDED-FOR") is always null,你应该在load balancer级别检查这个,可能是从那里修改的。

关于您的第二个问题request.getRemoteAddr() is always returning the same IP address from diffrent client machines,如果您看到API Docs,则会明确指出此api调用会返回发送请求的client address or address of last proxy,在您的情况下,它是{{ 1}}(我根据你的描述假设),这就是你收到相同IP地址的原因。

答案 1 :(得分:1)

An "X-FORWARDED-FOR" header 经常由位于客户端和Web服务器之间的代理,负载均衡器或反向代理插入。但是,这只是一个惯例/事实标准,而不是真正的标准。您的负载均衡器可能正在插入不同的标头,或根本没有标头。您需要检查负载均衡器的文档和/或配置。

request.getRemoteAddr()返回的IP地址是请求来自的直接上游IP地址。它很可能是您的负载均衡器的IP地址,但在其他情况下,它可能是客户端代理或NAT服务器的IP地址。通常,您不能依赖它作为实际客户端IP地址。