JAVA获取真实ip地址问题(记录)-Java学习
This is my Blog!!Welcome to you!!
【分享个人java学习心得和技术问题汇总】

JAVA获取真实ip地址问题(记录)

第一种 本地访问 获取到ip获取到0:0:0:0:0:0:0:1

问题原因: 这种情况只有在服务器和客户端都在同一台电脑上才会出现(例如用localhost访问的时候才会出现)

搞定方法:

  1. 本机访问的时候用127.0.0.1或本机ip代替localhost即可解决
  2. /etc/hosts这个东西作怪(在windows上应该是C:\Windows\System32\drivers\etc\hosts这个文件),只需要注释掉文件中的 # ::1 localhost 这一行即可解决问题

第二种 代理访问获取到的ip,如何获取真实ip

第一种情况:不通过代理上网,服务器端拿到真实IP

第二种情况:通过代理服务器如:Nginx,Squid等一层代理或多层代理上网,如下图:

nginx一般转发都是

从X-Forwarded-For的定义来看,ips[0]才是原始客户端ip,如果这个都不是,那拿第二个就更不靠谱了,我们平时检验的时候,可能是直接在内网挂代理去访问的,跟外面网友访问经过的网络路径不一样,后面不停添加的是经过的每一层代理ip才对,下面举例说明;

所以访问的流程应该是这样,客户端58.63.227.162发出请求,经过192.168.237.178, 192.168.238.218两层转发,到了192.168.239.196这台NGINX上,NGINX就把X-Real-IP头设成了自己看到的remote_addr,也就是直接发给到他的192.168.238.218,这时候resin收到这个包,对resin来说直接发给他的remote_addr就是NGINX的ip,也就是192.168.239.196,那么resin里面的request.getRemoteAddr()就是192.168.239.196,那么在resin里拿最原始的ip逻辑(也就是拿能够知道的最外层的ip)应该是这样:

如果XFF不为空,拿XFF的左边第一个

如果XFF为空,拿XRI

如果XRI为空,只能拿request.getRemoteAddr(),也就是只能拿到最直接发给他的机器ip了,

推荐代码这么写

未经允许不得转载:Java学习 » JAVA获取真实ip地址问题(记录)

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址