java获取客户端ip的正确方式

这篇具有很好参考价值的文章主要介绍了java获取客户端ip的正确方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。

如果使用了反向代理软件,将http://192.168.1.110:2046/的URL反向代理为http://www.abc.com/的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。

当我们访问http://www.abc.com/index.jsp/时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

外界流传的JAVA/PHP服务器端获取客户端IP都是这么取的:

伪代码:

1)ip = request.getHeader("X-FORWARDED-FOR ")

2)如果该值为空或数组长度为0或等于"unknown",那么:

ip = request.getHeader("Proxy-Client-IP")

3)如果该值为空或数组长度为0或等于"unknown",那么:

ip = request.getHeader("WL-Proxy-Client-IP")

4)如果该值为空或数组长度为0或等于"unknown",那么:

ip = request.getHeader("HTTP_CLIENT_IP")

5)如果该值为空或数组长度为0或等于"unknown",那么:

ip = request.getHeader("X-Real-IP")

6)如果该值为空或数组长度为0或等于"unknown",那么:

ip = request.getRemoteAddr ()

先说说这些请求头的意思

  • X-Forwarded-For

这是一个 Squid 开发的字段,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。

格式为X-Forwarded-For:client1,proxy1,proxy2,一般情况下,第一个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-IPnginx代理一般会加上此请求头。

下面是一个参考获取客户端IP地址的方法:

public static String getIpAddress(HttpServletRequest request) {
	String ip = request.getHeader("x-forwarded-for");
	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
		ip = request.getHeader("Proxy-Client-IP");
	}
	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
		ip = request.getHeader("WL-Proxy-Client-IP");
	}
	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
		ip = request.getRemoteAddr();
	}
	if (ip.contains(",")) {
		return ip.split(",")[0];
	} else {
		return ip;
	}
}
如果使用的是Druid连接池,可以参考使用:com.alibaba.druid.util.DruidWebUtils#getRemoteAddr方法,但这个是经过多级代理的IP地址,需要自己处理下获取第一个。

有几点要注意

  1. 这些请求头都不是http协议里的标准请求头,也就是说这个是各个代理服务器自己规定的表示客户端地址的请求头。如果哪天有一个代理服务器软件用oooo-client-ip这个请求头代表客户端请求,那上面的代码就不行了。

  1. 这些请求头不是代理服务器一定会带上的,网络上的很多匿名代理就没有这些请求头,所以获取到的客户端ip不一定是真实的客户端ip。代理服务器一般都可以自定义请求头设置。

  1. 即使请求经过的代理都会按自己的规范附上代理请求头,上面的代码也不能确保获得的一定是客户端ip。不同的网络架构,判断请求头的顺序是不一样的。

  1. 最重要的一点,请求头都是可以伪造的。如果一些对客户端校验较严格的应用(比如投票)要获取客户端ip,应该直接使用ip=request.getRemoteAddr(),虽然获取到的可能是代理的ip而不是客户端的ip,但这个获取到的ip基本上是不可能伪造的,也就杜绝了刷票的可能。(有分析说arp欺骗+syn有可能伪造此ip,如果真的可以,这是所有基于TCP协议都存在的漏洞),这个ip是tcp连接里的ip。文章来源地址https://www.toymoban.com/news/detail-452096.html

到了这里,关于java获取客户端ip的正确方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java编程技巧:获取ip地址、通过ip获取地理位置、获取客户端操作系统、获取客户端浏览器、获取主机名、获取操作系统、获取系统架构

    说明: 大家直接去对应项目位置找到代码,然后看着复制就行了 1.1、若依(自己写的代码) 项目:https://gitee.com/y_project/RuoYi 子模块:ruoyi-common 所在类:com.ruoyi.common.utils.IpUtils 所在方法:getIpAddr 详细位置:整个方法 1.2、Snowy(借助hutool工具包) 项目:https://gitee.com/xiaonuo

    2024年02月04日
    浏览(116)
  • 教你如何获取客户端IP和MAC地址的工具类,实战篇(Java版)

    在开发过程中,都会遇到获取IP或MAC地址的情况,那么如何在代码层面实现获取呢?接下来就为大家从代码层面介绍获取的方式。

    2024年02月03日
    浏览(47)
  • 叫你如何获取客户端IP和MAC地址的工具类,实战篇(Java版)

    在开发过程中,都会遇到获取IP或MAC地址的情况,那么如何在代码层面实现获取呢?接下来就为大家从代码层面介绍获取的方式。

    2024年02月12日
    浏览(51)
  • nginx-获取客户端IP地址

    上有服务器与客户端中间是有nginx代理服务器的,上游服务器如何获取客户端真实ip地址? nginx代理服务器设置X-Forwarded-For的header参数,代理服务器通过remote_addr获取客户端ip地址,将ip地址写入nginx代理服务器的X-Forwarded-For中, 上游服务端通过在nginx的这个参数拿到客户端IP地

    2024年02月11日
    浏览(43)
  • 【JavaScript】如何获取客户端IP地址?

    使用这个库:request-ip 它按照如下顺序获取请求的IP地址: X-Client-IP X-Forwarded-For (Header may return multiple IP addresses in the format: “client IP, proxy 1 IP, proxy 2 IP”, so we take the first one.) CF-Connecting-IP (Cloudflare) Fastly-Client-Ip (Fastly CDN and Firebase hosting header when forwared to a cloud function) True-Clie

    2024年02月05日
    浏览(47)
  • 获取客户端真实 IP 地址的最佳实践

    1. 业务上云带来性能收益 公司从去年全面推动业务上云,而以往 IDC 架构部署上,接入层采用典型的 4 层 LVS 多机房容灾架构,在业务高峰时期,扩容困难(受限于物理机资源和 LVS 内网网段的网络规划),且抵挡不住 HTTPS 卸载引发的高 CPU 占用。 而经过压力测试发现,使用

    2024年02月05日
    浏览(57)
  • Nginx代理后获取客户端真实IP地址

    在项目实际应用中,我们可能会需要获取到用户也就是客户端的真实IP地址,比如记录系统操作日志等情况。 通常情况下我们可以使用以下方式来获取IP地址 但是当我们使用Nginx反向代理项目地址后,使用以上方法只能获取到Nginx服务器的IP地址,并不是客户端的IP地址。 解决

    2023年04月11日
    浏览(46)
  • Qt 获取本机 ip地址方法 获取客户端ip和端口的方法

    上述函数返回本机所有IPv4的ip地址列表,比如192.168.1.10|192.166.1.95 其它方法=》 获取客户端IP地址:

    2024年02月14日
    浏览(41)
  • ASP.NET 获取客户端IP、MAC地址

      qqwry.dat 纯真IP数据库下载地址:   

    2024年02月15日
    浏览(48)
  • Docker部署Nginx,无法获取客户端真实ip地址

    在部署docker版本nginx进行请求转发,意外发现nginx打印日志中的客户端ip并非为客户端的真实ip(221.237.xxx.xxx),而是docker虚拟网卡的ip(172.17.0.1) 开始猜测是nginx配置问题,对比其他环境,发现配置相同,但其他环境未出现此情况 通过查询资料,推测是docker网桥和linux防火墙存在

    2023年04月21日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包