在 JSP 中获取客户端的 IP 地址

7

我需要在JSP页面中获取客户端的IP地址。 我尝试过以下方法:

request.getRemoteAddr()
request.getHeader("X_FORWARDED_FOR")
request.getHeader("HTTP_CLIENT_IP")
request.getHeader("WL-Proxy-Client-IP")
request.getHeader("Proxy-Client-IP")
request.getHeader("REMOTE_ADDR")

然而,这些方式都没有返回所需的IP地址。我该如何在JSP页面中获取客户端的IP地址?


如果您使用自定义标头,请始终将它们命名为 X-<custom-name> - Michael-O
request.getRemoteAddr()返回什么? - Jeshurun
另请参见问题。 - Jeshurun
request.getRemoteAddr() 返回的是 0:0:0:0:0:0:0:1,这并不是客户端真实 IP 的值。 - Satish Sharma
1
尝试使用request.getRemoteHost()方法,如果客户端未使用客户端返回的网关IP,则返回此方法。否则,此方法将返回网关的IP。 - janith1024
4个回答

13
为了获取客户端的IP地址,我使用了以下方法。
<%   String ip = request.getHeader("X-Forwarded-For");  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("Proxy-Client-IP");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("WL-Proxy-Client-IP");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_CLIENT_IP");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getRemoteAddr();  
        }
        %>

希望这有所帮助,请留下您的反馈。

8
<%
out.print( request.getRemoteAddr() );
out.print( request.getRemoteHost() );
%>

如果客户端位于代理后面,您可能无法获取真实的客户端 IP 地址,而是会得到代理服务器的 IP 地址。不过,代理服务器有时会在特殊的 HTTP 标头中包含请求客户端的 IP 地址。

<%
out.print( request.getHeader("x-forwarded-for") );
%>

但是当客户端和请求的服务器之间没有代理配置时,如何获取客户端的IP。 - Satish Sharma
请查看此帖子:链接 - kinaesthesia
输出结果为 0:0:0:0:0:0:0:1,你有任何想法吗? - Harshil Kulkarni

3

您的应用程序服务器是否位于负载均衡器、代理或 Web 服务器后面?以 F5 负载均衡器为例,它使用“rlnclientipaddr”头公开客户端 IP 地址:

request.getHeader("rlnclientipaddr");

0

你使用反向代理,比如 Apache 代理吗? http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

当以反向代理模式(例如使用 ProxyPass 指令)运行时,mod_proxy_http 添加了几个请求头以便将信息传递给源服务器。这些头部包括:

X-Forwarded-For
The IP address of the client.
X-Forwarded-Host
The original host requested by the client in the Host HTTP request header.
X-Forwarded-Server
The hostname of the proxy server.

服务器和客户端之间没有使用代理。由于未使用代理,使用 X-Forwarded-For、X-Forwarded-Host 和 X-Forwarded-Server 获取的所有值都为 null。 - Satish Sharma
如果您没有使用反向代理,只需检查使用HTTP Servlet API - httpServletRequest.getRemoteHost()和getRemotePort() http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html - Andrey Borisov
httpServletRequest 中没有任何可以提供客户端 IP 的信息。我已经检查了整个 API。 - Satish Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接