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

Jer*_*nce 23 java spring ipv4 ipv6 java-ee

我已经使用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();
Run Code Online (Sandbox Code Playgroud)

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

有什么问题,我怎么能得到相同的IP格式?

谢谢

Ted*_*ham 46

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

-Djava.net.preferIPv4Stack=true
Run Code Online (Sandbox Code Playgroud)

  • 8年后我改变了我接受的答案。因为它似乎对人们有更多帮助;) (2认同)

unb*_*eli 12

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

  • 好的,对于您的测试尝试使用127.0.0.1而不是localhost.对于客户端,请确保您的真实主机名具有IPv4或IPv6地址,而不是两者. (4认同)
  • 那么,我该如何识别用户呢?没有要求他改变各种设置. (2认同)