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

时间:2010-06-25 14:31:52

标签: java spring java-ee ipv6 ipv4

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

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

但是当我用flash上​​传我的文件时(以及在同一个webapp上的帖子请求)我得到一个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格式?

感谢

3 个答案:

答案 0 :(得分:42)

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

-Djava.net.preferIPv4Stack=true

答案 1 :(得分:11)

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

答案 2 :(得分:0)

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

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