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

Java 为什么request.getRemoteAddr()根据上下文(post查询或ajax查询)返回ipv4或ipv6,java,spring,jakarta-ee,ipv6,ipv4,Java,Spring,Jakarta Ee,Ipv6,Ipv4,我用Spring/GWT开发了一个web应用程序,它使用Flash上传文件 当我使用GWT发送ajax请求并尝试获取用户ip地址时,我会得到一个ipv4地址,如:127.0.0.1 但当我用flash上传文件时(以及在同一个webapp上的post请求),我会得到一个ipv6地址0:0:0:0:0:0:1 我使用相同的代码获取用户ip,即: ServletRequestAttributes att = (ServletRequestAttributes) RequestContextHolder

我用Spring/GWT开发了一个web应用程序,它使用Flash上传文件

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

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

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

ServletRequestAttributes att = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
att.getRequest().getRemoteAddr();
问题是,我使用了一个使用ip地址的签名,以确保用户可以上载文件(由于使用flash上载时会话丢失的错误),并且当我使用ajax或通过flash发布时,ip地址会更改

问题是什么?如何获得相同的ip格式


谢谢

原因是您在浏览器中键入的名称同时具有ipv4和ipv6地址。浏览器选择使用ipv4,flash选择使用ipv6。在服务器端,您对此无能为力(无法转换)。

但是,您可以更改DNS并使您的名称只有一个地址,即ipv4或ipv6。您还可以使用文字IP地址(127.0.0.1)而不是名称(localhost)进行连接。

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

-Djava.net.preferIPv4Stack=true

如果您获得了IPv6地址,则将使用IPv6。IPv4和IPv6是不同的协议,当两者都可用时,客户端选择使用哪一种协议


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

那么,我如何识别用户?不要求他更改各种设置。您(客户端)使用的主机名是什么?是本地主机吗?它是真实主机名吗?localhost(对于我调试时使用)和真实主机名(真实客户端)好的,对于您的测试,请尝试使用127.0.0.1而不是localhost。对于客户端,请确保您的真实主机名具有IPv4或IPv6地址,而不是两者都具有。@Alexander Pogrebnyak不是一直存在吗?您无法控制用户使用的IP地址,请尝试cookies。8年后,我更改了接受的答案。因为它似乎更能帮助人们;)