Overview

前面讲到,消息队列需要用到客户端的ip地址和时间戳,获取客户端的ip地址就需要下面几行简单的代码。

import javax.servlet.http.HttpServletRequest;

HttpServletRequest request = ServletActionContext.getRequest();
String ipAddress = request.getHeader("X-FORWARDED-FOR");  
if (ipAddress == null) {  
    ipAddress = request.getRemoteAddr();  
}
System.out.println(ipAddress);

我将上面几行代码,放入之前的PhosphoPredict项目的action中做实验,结果显示如下:

0:0:0:0:0:0:0:1

这和我们平时的认知不同,下面就是解决办法。

1.修改hosts文件

我在ubuntu14.04系统下,打开/etc/hosts文件,看到如下信息:

# Localhost
127.0.0.1       localhost
127.0.0.1       young
255.255.255.255     broadcasthost
::1     localhost
fe80::1%lo0     localhost

我们将

::1     localhost

这句注释掉,再提交,

127.0.0.1

正确答案就出现了。
其他系统,请自行查找文件目录并修改。

2.设置eclipse

我们在eclipse运行本程序的时候,可以配置一下运行参数:
依次点击Run→Run Configurations…→Apache Tomcat→Tomcat v7.0 Server at localhost,这时候点击右边的Arguments,在下面的VM arguments框中加上一句:

-Djava.net.preferIPv4Stack=true

最后点击Apply。然后就可以了。

总结:这是因为,只有在本机提交的时候,才会出现,客户端提交就会显示真实ip地址了。而系统会优先显示ipv6格式的本机ip。我们两种方法,第一种是屏蔽掉ipv6的表示方法,第二种则是指定优先ipv4表示。
两种方法更推荐第二种。

这篇文章主要参考了stackoverflow.