如何从客户端的ajax请求中获取到客户端公网ip地址?

UPC子夜 2021-02-17 02:10:35
搭建了一个tomcat服务,希望在client端通过http调用的时候,获取到客户端真实的公网ip地址。

当前客户端调用请求时,server端通过request.getHeader("x-forwarded-for") getHeader("Proxy-Client-IP") getHeader("WL-Proxy-Client-IP") getRemoteAddr()等方法都尝试过了,取到的一般都是127 或者192等,取不到真正想要的地址,比如 124.128.77.*。

访问http://ip.chinaz.com/这种网站时,就能够返回当前客户端所在的ip地址,不知道怎么实现的。

别告诉我让客户端访问上述网站,爬取真实ip,这种方法可行,不过不稳定,万一网站停服就over了。

有没有更加保险的方法获取client端的公网ip?感谢。

...全文
719 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
UPC子夜 2021-02-24
  • 打赏
  • 举报
回复
引用 7 楼 我的大神666 的回复:
私网网段: A类:10.0.0.0/8:10.0.0.0-10.255.255.255 B类:172.16.0.0/12:172.16.0.0-172.31.255.255 C类:192.168.0.0/16:192.168.0.0-192.168.255.255 20.10段就是有效公网ip,有可能请求是通过20.10段转发到你服务器. 最简单验证: 在收到请求时执行脚本命令查看输出: windows: netstat -ano | findstr "80" > log.txt linux: netstat -ant | grep "80" > log.txt 等执行完后才结束网络请求.
感谢 是因为网站搭在了局域网里 所有请求都被局域网的nat处理了 所以获取的都是无线网分配的ip 把网站穿透到公网上 客户端再访问 remoteaddr中获取到的ip就对了
「已注销」 2021-02-19
  • 打赏
  • 举报
回复
修改编辑(注释去掉)${catalina}/conf/server.xml:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %U %q %S" resolveHosts="false" />
%h是客户端ip,%U是请求url路径,%q是get参数:?a=1&b=2,%S是session ID 1.如果session ID跟response.getHeader("Set-Cookie")里的JSESSIONID或者跟request.getSession().getId()对的上,从日志检索session ID,然后正则出ip; 2.另一种客户端get一个随机数?id=xxxxxxxx,收到请求后从日志检索id=xxxxxxxx,然后正则出ip;
「已注销」 2021-02-19
  • 打赏
  • 举报
回复
私网网段: A类:10.0.0.0/8:10.0.0.0-10.255.255.255 B类:172.16.0.0/12:172.16.0.0-172.31.255.255 C类:192.168.0.0/16:192.168.0.0-192.168.255.255 20.10段就是有效公网ip,有可能请求是通过20.10段转发到你服务器. 最简单验证: 在收到请求时执行脚本命令查看输出: windows: netstat -ano | findstr "80" > log.txt linux: netstat -ant | grep "80" > log.txt 等执行完后才结束网络请求.
UPC子夜 2021-02-19
  • 打赏
  • 举报
回复
引用 4 楼 我的大神666 的回复:
修改编辑(注释去掉)${catalina}/conf/server.xml:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %U %q %S" resolveHosts="false" />
%h是客户端ip,%U是请求url路径,%q是get参数:?a=1&b=2,%S是session ID 1.如果session ID跟response.getHeader("Set-Cookie")里的JSESSIONID或者跟request.getSession().getId()对的上,从日志检索session ID,然后正则出ip; 2.另一种客户端get一个随机数?id=xxxxxxxx,收到请求后从日志检索id=xxxxxxxx,然后正则出ip;
这个获取到的ip也是20.10段 是无线网给分配的ip 按这个去定位 就是美-国 不是我们想要的124.128.77段
UPC子夜 2021-02-19
  • 打赏
  • 举报
回复
引用 3 楼 asdfv63 的回复:
如果是公网访问的服务端,得到了美国网段的地址,可以使用这个机器到你上面发的http://ip.chinaz.com/这里查下,因为有的拨号上网分配的ip存在外国的,尤其是那种长城宽带的
从他们机器访问http://ip.chinaz.com/ 得到的是124.128.77 能定位到济南 但是request中getremoteaddr接收到的还是20.10段 应该是无线网给分配的ip地址
asdfv63 2021-02-17
  • 打赏
  • 举报
回复
如果是公网访问的服务端,得到了美国网段的地址,可以使用这个机器到你上面发的http://ip.chinaz.com/这里查下,因为有的拨号上网分配的ip存在外国的,尤其是那种长城宽带的
UPC子夜 2021-02-17
  • 打赏
  • 举报
回复
引用 1 楼 asdfv63 的回复:
获取到的地址是127 或者192等,是不是这些客户端和你的服务端是本机或者同一个局域网的
本机是127 其他机器有获取到20.10段的 也不对 因为20.10定位到美-国去了 肯定获取的还是有问题的
asdfv63 2021-02-17
  • 打赏
  • 举报
回复
获取到的地址是127 或者192等,是不是这些客户端和你的服务端是本机或者同一个局域网的

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧