使用 request.getRemoteAddr() 返回 0:0:0:0:0:0:0:1

问题描述 投票:0回答:5

我正在尝试在我的 web 应用程序中打印登录用户的 IP 地址。如果用户使用 IP 地址

192.168.10.120:8080/WebApplication
从另一台 PC(位于同一网络下,因为 Web 应用程序在我的电脑中运行)连接,则代码
request.getRemoteAddr()
request.getLocalAddr())
返回他的 IP 地址。当我从运行 Web 应用程序的电脑登录时,我得到这个 IP 地址 0:0:0:0:0:0:0:1。

这是为什么呢?这些命令之间有什么区别(我应该使用哪个?)。非常感谢!

java jsp servlets
5个回答
67
投票

当我们从 IPv4 转向 IPv6 时,他们会将环回地址 (localhost) 从

0:0:0:0:0:0:0:1
更改为
127.0.0.1
,这就是您获得此地址的原因。

功能方面:

  • getRemoteAddr()
    返回客户端IP

  • getLocalAddr()
    返回应用程序所在服务器的IP 运行


64
投票

在您的情况下,当您尝试在本地计算机上访问它时,它将返回该值。但是让您的一位朋友访问它,您将收到预期的结果

getRemoteAddr

来自javadoc:

getRemoteAddr - 返回发送请求的客户端或最后一个代理的 IP 地址

getLocalAddr - 返回接收请求的接口的 IP 地址。


9
投票

getRemoteAddr()解决了你的目的,但如果客户端位于任何代理后面,那么你将获得代理的IP地址:

返回客户端或最后一个代理的互联网协议(IP)地址 发送请求的。

getLocalAddr() 返回应用程序运行所在服务器的 IP。


1
投票

如果您想获取 127.0.0.1 而不是 0:0:0:0:0:0:0:1,请使用以下属性 CATALINA_OPTS="$CATALINA_OPTS -Djava.net.preferIPv4Stack=true" 启动应用程序服务器进程


0
投票

如果使用 java 并且您需要知道客户端 IP 地址或本地计算机的 IP 地址(如果应用程序在本地主机上运行):

String ip = "unknown"; 
try{
    ip = request.getRemoteAddr();
    if(ip.equals("0:0:0:0:0:0:0:1") || ip.equals("127.0.0.1")) {
        InetAddress hostAddress = InetAddress.getLocalHost();
        ip = hostAddress.getHostAddress();
    }
} catch (UnknownHostException e) {
    log.info("got unknown host");
    ip = "unknown";
}
© www.soinside.com 2019 - 2024. All rights reserved.