为什么request.getRemoteAddr()根据上下文(post query或ajax query)返回ipv4或ipv6

我已经使用Spring / GWT使用Flash上​​传文件。

当我用GWT发送ajax请求并尝试获取用户的ip地址时,我得到一个ipv4地址,如:127.0.0.1

但是当我用flash上​​传我的文件(以及在同一个webapp上的post请求)时,我得到一个ipv6地址0:0:0:0:0:0:0:1

我使用相同的代码来获取用户ip,即:

ServletRequestAttributes att = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); att.getRequest().getRemoteAddr(); 

问题是我使用一个使用ip地址的签名来确保用户可以上传文件(由于使用flash上​​传时会话丢失的错误)以及当我使用ajax或Post via flash时ip地址发生变化。

有什么问题,如何获得相同的IP格式?

谢谢

您可以通过使用此标志启动服务器来修复它

 -Djava.net.preferIPv4Stack=true 

原因是您在浏览器中键入的名称同时包含ipv4和ipv6地址。 浏览器选择使用ipv4,flash选择使用ipv6。 在服务器端没有什么可以做的(没有办法转换)。
但是,您可以更改DNS并使您的名称只有一个地址,ipv4或ipv6。 您还可以使用文字IP地址(127.0.0.1)连接,而不是名称(localhost)。

你得到一个IPv6地址然后使用IPv6。 IPv4和IPv6是不同的协议,客户端选择在两者都可用时使用哪个协议。

如果您需要客户端的IPv4地址,则可以通过不在DNS中通告IPv6地址来强制它们使用它。 随着IPv6的部署越来越多,这将是个坏主意。 支持两者都很好,因此最好使用IPv6处理客户端。