加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Java口试-怎样获取客户端真实IP

发布时间:2019-10-30 01:05:05 所属栏目:建站 来源:健程之道
导读:在举办一些小游戏开拓时,我们常常较量存眷的一个成果即是分享。针对分享,我们但愿能按照各个都市可能地域,能有差异的分享文案,辨识地域的成果假如由处事器来完成的话,我们就必要知道客户端的真实IP。本日我们就来看看处事器是怎样获取到客户端的真实I
副问题[/!--empirenews.page--]

在举办一些小游戏开拓时,我们常常较量存眷的一个成果即是分享。针对分享,我们但愿能按照各个都市可能地域,能有差异的分享文案,辨识地域的成果假如由处事器来完成的话,我们就必要知道客户端的真实IP。本日我们就来看看处事器是怎样获取到客户端的真实IP的。

Java口试-怎样获取客户端真实IP

nginx设置

起首,一个哀求必定是可以分为哀求头和哀求体的,而我们客户端的IP地点信息一样平常都是存储在哀求头里的。假如你的处事器有效Nginx做负载平衡的话,你必要在你的location内里设置X-Real-IP和X-Forwarded-For哀求头:

  1. location ^~ /your-service/ { 
  2. proxy_set_header X-Real-IP $remote_addr; 
  3. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  4. proxy_pass http://localhost:60000/your-service/; 

1. X-Real-IP

在《拭魅战nginx》中,有这么一句话:

这句话的意思是说,当你行使了nginx反向处事器后,在web端行使request.getRemoteAddr()(本质上就是获取$remote_addr),取得的是nginx的地点,即$remote_addr变量中封装的是nginx的地点,虽然是没法得到用户的真实ip的。可是,nginx是可以得到用户的真实ip的,也就是说nginx行使$remote_addr变量时得到的是用户的真实ip,假如我们想要在web端得到用户的真实ip,就必需在nginx里作一个赋值操纵,即我在上面的设置:

  1. proxy_set_header X-Real-IP $remote_addr; 

2. X-Forwarded-For

X-Forwarded-For变量,这是一个squid开拓的,用于辨认通过HTTP署理或负载均衡器原始IP一个毗连到Web处事器的客户机地点的非rfc尺度,假若有做X-Forwarded-For配置的话,每次颠末proxy转发城市有记录,名目就是client1,proxy1,proxy2以逗号离隔各个地点,因为它长短rfc尺度,以是默认是没有的,必要逼迫添加。在默认环境下颠末proxy转发的哀求,在后端看来长途地点都是proxy端的ip 。也就是说在默认环境下我们行使request.getAttribute("X-Forwarded-For")获取不到用户的ip,假如我们想要通过这个变量得到用户的ip,我们必要本身在nginx添加设置:

  1. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

意思是增进一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,留意是增进,而不是包围,虽然因为默认的X-Forwarded-For值是空的,以是我们总感受X-Forwarded-For的值就便是$proxy_add_x_forwarded_for的值,现实被骗你搭建两台nginx在差异的ip上,而且都行使了这段设置,那你会发此刻web处事器端通过request.getAttribute("X-Forwarded-For")得到的将会是客户端ip和第一台nginx的ip。

3. 那么$proxy_add_x_forwarded_for又是什么?

$proxy_add_x_forwarded_for变量包括客户端哀求头中的X-Forwarded-For与$remote_addr两部门,他们之间用逗号分隔。

举个例子,有一个web应用,在它之前通过了两个nginx转发,www.linuxidc.com即用户会见该web通过两台nginx。

在第一台nginx中,行使:

  1. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

此刻的$proxy_add_x_forwarded_for变量的X-Forwarded-For部门是空的,以是只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值往后,X-Forwarded-For变量的值就是用户的真实的ip地点了。

到了第二台nginx,行使:

  1. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

此刻的$proxy_add_x_forwarded_for变量,X-Forwarded-For部门包括的是用户的真实ip,$remote_addr部门的值是上一台nginx的ip地点,于是通过这个赋值往后此刻的X-Forwarded-For的值就酿成了“用户的真实ip,第一台nginx的ip”,这样就清晰了吧。

处事器获取真实IP

代码为:

  1. public static String getIpAddress(HttpServletRequest request) { 
  2. String Xip = request.getHeader("X-Real-IP"); 
  3. String XFor = request.getHeader("X-Forwarded-For"); 
  4. if (!Strings.isNullOrEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) { 
  5. //多次反向署理后会有多个ip值,第一个ip才是真实ip 
  6. int index = XFor.indexOf(","); 
  7. if (index != -1) { 
  8. return XFor.substring(0, index); 
  9. } else { 
  10. return XFor; 
  11. XFor = Xip; 
  12. if (!Strings.isNullOrEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) { 
  13. return XFor; 
  14. if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { 
  15. XFor = request.getHeader("Proxy-Client-IP"); 
  16. if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { 
  17. XFor = request.getHeader("WL-Proxy-Client-IP"); 
  18. if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { 
  19. XFor = request.getHeader("HTTP_CLIENT_IP"); 
  20. if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { 
  21. XFor = request.getHeader("HTTP_X_FORWARDED_FOR"); 
  22. if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { 
  23. XFor = request.getRemoteAddr(); 
  24. return XFor; 

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读