java后端获取客户端真实ip,原理:

一般都是下面代码中的做法:但很多人只知道这样能拿到,稍微有改动就不知道怎么办了
看看网上的各种说法,接下来容我一一讲解,如有纰漏,敬请指正。
public static String getIpAdrress(HttpServletRequest request) {String ip = null;//X-Forwarded-For:Squid 服务代理String ipAddresses = request.getHeader("X-Forwarded-For");System.out.println("====ipAddresses:"+ipAddresses);Enumeration<String> headerNames = request.getHeaderNames();while (headerNames.hasMoreElements()) {//打印所有头信息String s = headerNames.nextElement();String header = request.getHeader(s);System.out.println(s+"::::"+header);}System.out.println("headerNames:"+JSON.toJSONString(headerNames));System.out.println("RemoteHost:"+request.getRemoteHost());System.out.println("RemoteAddr:"+request.getRemoteAddr());String unknown = "unknown";if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {//Proxy-Client-IP:apache 服务代理ipAddresses = request.getHeader("Proxy-Client-IP");}if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {//WL-Proxy-Client-IP:weblogic 服务代理ipAddresses = request.getHeader("WL-Proxy-Client-IP");}if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {//HTTP_CLIENT_IP:有些代理服务器ipAddresses = request.getHeader("HTTP_CLIENT_IP");}if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {//X-Real-IP:nginx服务代理ipAddresses = request.getHeader("X-Real-IP");}//有些网络通过多层代理,那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IPif (ipAddresses != null && ipAddresses.length() != 0) {ip = ipAddresses.split(",")[0];}//还是不能获取到,最后再通过request.getRemoteAddr();获取if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {ip = request.getRemoteAddr();}return ip;}

讲讲上面获取用户ip的代码

首先有个基本概念,就是客户端要想和服务端交互,就必须告诉服务端自己的ip,毕竟有TCP三次握手。
当然,这些都是普通用户,特殊用户会隐藏ip,这种暂且不说。
再从服务端说起,如果服务器直接把IP暴漏出去,那么request.getRemoteAddr()就能拿到客户端ip。

但目前流行的架构中,基本上服务器都不会直接把自己的ip暴漏出去,一般前面还有一层或多层反向代理,常见的nginx居多。
加了代理后,相当于服务器和客户端中间还有一层,这时候request.getRemoteAddr()拿到的就是代理服务器的ip了,并不是客户端的ip。所以这种情况下,一般会在转发头上加X-Forwarded-For等信息,用来跟踪原始客户端的ip。
这时候,才会用上面的这些代码。解释下这些加上的信息:

X-Forwarded-For:
这是一个 Squid 开发的字段,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。
格式为X-Forwarded-For:client1,proxy1,proxy2,一般情况下,第一个ip为客户端真实ip,后面的为经过的代理服务器ip。
上面的代码注释也说的很清楚,直接截取拿到第一个ip。
Proxy-Client-IP/WL- Proxy-Client-IP:
这个一般是经过apache http服务器的请求才会有,用apache http做代理时一般会加上Proxy-Client-IP请求头,
而WL-Proxy-Client-IP是他的weblogic插件加上的头。
这种情况也是直接能拿到。
HTTP_CLIENT_IP:
有些代理服务器也会加上此请求头。
X-Real-IP:
nginx一般用这个。

总结

不知道你有没有发现,上面这些头信息,都是各做各的,没有一个统一,所以代码也就写成了这样,其实就是一个一个试呗。

所以指不定以后再来个什么代理服务器,头信息是XX-xx-xx,那我们的代码也要做相应的修改。

还有,这代码只是一个大概的思想,具体情况具体对待,因为获取不到请求头这些ip的情况也不在少数,哪怕代理层以后都统一了,用户层还有其他幺蛾子方法,就是不让你知道他的ip,所以总的结论就是上有政策,下有对策。

举例几个常见的案例

1.服务端防刷
2.记录用户操作
等等,总之就是服务端监控和区分客户端的,经常会用ip作为一个可靠指标

java后端获取客户端(用户)真实ip,原理相关推荐

  1. Java如何获取客户端主机真实IP地址

    项目开发中,小编遇到一种需求,就是将系统项目与某台主机的IP地址绑定,让该系统只能在某台主机上使用,不要问小编为什么,我也是第一次遇到这么奇怪的需求,当然也不要问小编为什么不使用权限控制,现在的权限控 ...

  2. JavaWeb 获取客户端的真实IP地址

    通常我们在JavaWeb中获取客户端IP地址只需要使用request.getRemoteAddr();方法即可 如果前端使用了Nginx等反向代理的话,我们使用request.getRemoteAdd ...

  3. 通过Request获取客户端的真实IP

    我们在做项目的时候经常需要获取客户端的真实ip去进行判断,为此搜索了相关文章,以下这个讲解的比较明白,直接拿来 https://blog.csdn.net/yin_jw/article/details ...

  4. 如何获取客户端的真实IP

    原文地址:http://blog.csdn.net/zhangyaoming2004/article/details/6792695 问题引出: <hr/> 在JSP里,获取客户端的IP地 ...

  5. PHP获取客户端的真实IP

    REMOTE_ADDR只能获取访问者本地连接中设置的IP,如中南民族大学校园网中自己设置的10.X.XXX.XXX系列IP,而这个函数获取的是局域网网关出口的IP地址, 如果访问者使用代理服务器,将不 ...

  6. 获取客户端ip_获取客户端访问真实IP

    通常,当 Kubernetes 集群内的客户端连接到服务的时候,是支持服务的 Pod 可以获取到客户端的 IP 地址的,但是,当通过节点端口接收到连接时,由于对数据包执行了源网络地址转换(SNAT), ...

  7. PHP 获取客户端的真实IP

    最近开发工程中,需要给第三方提供接口,由于是仅仅对单独一人提供接口支持,就暂时采取了IP白名单过滤的方式处理.下面是获取用户IP地址的方法,希望能够帮助到大家. /*** 获取当前的IP* @retu ...

  8. 穿透代理获取用户真实IP地址

    文章目录 一.场景 二.方法 1.微信官方方法 (1)没有代理 (2)有代理 2.非官方方法 (1)代码 (2)说明 (3)补充 一.场景 在对接微信H5支付API时,有一关键步骤是获取到用户的真实I ...

  9. 使用nginx代理的情况下获取用户真实IP

    ##1.背景知识 1.1. 前提知识点: 还有nginx中的几个变量: remote_addr 代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站 ...

最新文章

  1. 来认识世界上第一支AI基金:模仿股票分析师 365天无间断工作
  2. 脑电分析系列[MNE-Python-10]| 信号空间投影SSP数学原理
  3. 【CV秋季划】人脸识别经典难题介绍,抗遮挡,跨年龄,异质源,少样本等
  4. Git 系列(二):初步了解 Git
  5. 计算机知识产权结合,计算机知识产权.doc
  6. linux里qt画直线_Qt与Web混合开发(一)简单使用
  7. Open Infrastructure Summit 2019,炼就成功开源范示;阿里云居亚太市场第一;高通将获45亿美元和解金...
  8. 华为机试——数字颠倒
  9. iPhone 14屏幕细节曝光:LTPO OLED面板仍为Pro版专属
  10. 使用Python批量随机化文件名
  11. 世界第一台电脑_阿里推出云电脑“无影”,名片大小的机身,却有无穷的计算能力...
  12. [Lab1]-EIGRP试验
  13. python语言是编程还是脚本_编程语言和脚本语言有什么区别?
  14. DBMS 中实现事务持久性的子系统是()
  15. 在Xcode6中使用故事版来搭建你的工程
  16. Expected response code 250 but got code “501“, with messa php laravel 发邮件 smtp qq邮箱 阿里云
  17. 计算机视觉——相机定位
  18. 26.JavaScript对象和基础类型之间的转换、hint、Symbol.toPrimitive、toString、valueOf
  19. 爬去微信小程序服务器代码,Python爬取微信小程序通用方法代码实例详解
  20. Matlab plot()自定义线宽及保存高清大图

热门文章

  1. SSM:出现Connections could not be acquired from the underlying database异常的解决
  2. Python:绘图保存时出现空白图像的解决和如何保存图片
  3. redis集群的搭建详细教程
  4. IDEA换行CRLF, LF, CR的解释和默认设置
  5. c#之using关键字
  6. 搭建Hexo博客(一)-创建Hexo环境
  7. python xml
  8. vim 插件之commentary
  9. 离婚从来不是解决家庭危机的唯一办法
  10. Spring常用注解的讲解