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

65

我想在我的Web应用程序中打印已登录用户的IP地址。如果用户从另一台PC连接(该计算机与Web应用程序运行在我PC上的同一网络下)并使用IP地址192.168.10.120:8080/WebApplication,那么代码request.getRemoteAddr()request.getLocalAddr()将返回他的IP地址。当我从运行Web应用程序的PC登录时,我得到的IP地址是0:0:0:0:0:0:0:1。

为什么会这样?这些命令有什么区别(应该使用哪个)?非常感谢!


14
在本地计算机上,localhost会返回该IP地址。在其他计算机上,你将看到实际的IP地址。 - Makky
1
谢谢@Makky,你知道这两个命令之间的区别吗? - yaylitzis
getLocalAddr() 获取接收请求的机器的IP地址。来源。相反,getRemoteAddr() 获取请求资源的机器的IP地址。来源 - Michael Wiggins
这并没有回答问题,而且已经有被接受的答案了。 - ziggystar
显示剩余2条评论
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地址:

返回发送请求的客户端或最后一个代理的Internet协议(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";
}

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