`
bsr1983
  • 浏览: 1116384 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】java中request获取IP

 
阅读更多

项目中需要和第三方平台接口,加了来源IP鉴权功能,测试时发现没有问题,但是部署以后发现存在问题,一直鉴权不通过,一群人抓瞎。

我找到那块的代码,跟了一遍流程发现逻辑没有啥问题,但是最终的结果却还是鉴权不通过,实在有些诡异。其基本逻辑为先取得配置的IP列表,然后通过request.getRemoteAddr()取得客户端的IP地址,做鉴权和校验,逻辑没问题,那么肯定是request.getRemoteAddr()出了问题,google下,发现有人遇到类似的问题。

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

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

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

原来如此,我们的项目中正好是有前置apache,将一些请求转发给后端的weblogic,看来就是这样导致的咯。

给出一份还算靠谱的代码,如下:

Java代码

public String getIpAddr(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();
		}
		return ip;
	}

 

如果有人遇到类似问题,请多加留意,呵呵。

PS:可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串ip值,究竟哪个才是真正的用户端的真实IP呢?
答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100,用户真实IP为: 192.168.1.110

分享到:
评论

相关推荐

    java中通过request获取IP以及MAC地址.java

    获取用户请求IP地址 根据IP地址获取mac地址

    IP工具类,通过传入的request获取ip地址(JAVA)

    在这个例子中,`ServerHttpRequest`的`getRemoteAddress().getHostString()`方法用于获取IP地址。同样,如果在反向代理环境中,我们需要检查`X-Forwarded-For`头来获取真实的IP: ```java String forwardedFor = ...

    IpUtil工具类--通过request获取IP,通过IP获取地址

    IpUtil工具类--通过request获取IP,通过IP获取地址(需要联网,调用淘宝的IP库)。使用场景:在网站开发记录用户增删改查日志的时候,往往需要记录操作人的IP地址,来准确的生成操作日志记录等

    java中获取客户端IP MAC信息

    可以通过java获取客户端IPMAC主机名等信息。下载就能用,欢迎下载!

    java 获取客户端ip mac地址

    #### 三、在Linux环境下获取IP地址 在Linux环境中,可以通过`InetAddress`类来获取主机的IP地址。但是需要注意的是,对于多网卡的情况,需要遍历所有网络接口来找到正确的IP地址。 **示例代码**: ```java public...

    java IP地址工具类,java IP地址获取,java获取客户端IP地址

    在Java编程中,获取IP地址是一项常见的任务,特别是在网络编程和服务器开发中。这个"java IP地址工具类"是为了解决这个问题而设计的。它提供了便捷的方法来获取和处理IP地址,尤其对于获取客户端IP地址在Web应用中至...

    java非常强的获取客户端真实IP的两种方法

    此时,如果直接使用`request.getRemoteAddr()`获取IP,则得到的是127.0.0.1或192.168.1.110这样的内部地址,而非客户端的真实IP。 #### 二、获取真实IP的第一种方法 为了获取客户端的真实IP地址,可以利用HTTP头部...

    用Java来获取访问者真实的IP地址

    // 首先尝试从X-Forwarded-For头部获取IP地址 String ip = request.getHeader("X-Forwarded-For"); // 如果X-Forwarded-For为空或者为"unknown",则尝试从Proxy-Client-IP头部获取 if (ip == null || ip.length...

    Java获取客户端真实IP地址

    然而,在存在反向代理服务器的环境中,传统的`request.getRemoteAddr()`方法可能无法直接获取到客户端的真实IP地址。这是因为当请求经过反向代理(如Apache、Squid等)后,原始的IP地址会被代理服务器所替代,导致...

    非request方式获取IP地址

    ### 非request方式获取IP地址 #### 1. 方法概述 本示例中的`getIp()`方法采用Java标准库中的`java.net.InetAddress`类来获取本地主机的IP地址。这种方法避免了使用HTTP请求或套接字连接所带来的复杂性,提供了一种...

    java socket 用户真实IP测试

    在标题“java socket nginx tcp转发 用户真实IP测试”中,主要探讨的是如何在Java的Socket连接中,通过Nginx的TCP转发获取到实际用户的IP地址。 在描述中提到的博客文章,很可能是详细介绍了这个问题的解决方案。...

    java获取客户端ip及mac地址

    ### Java 获取客户端 IP 地址 在 Web 开发中,获取客户端 IP 地址是一项非常重要的功能,尤其是在需要记录用户活动、实现地理位置定位...以上就是关于如何在 Java 中获取客户端 IP 地址及 MAC 地址的相关知识点介绍。

    Java根据Request获取客户端IP

    Java根据Request获取客户端IP是指在Java Web开发中获取客户端的IP地址,以便进行相应的处理和分析。在JSP中,获取客户端IP地址的方法是使用request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是,如果...

    Java获取客户端IP及Mac地址(同网段).rar

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

    java获取用户真实ip

    总之,通过上述方法可以在Java中有效地获取到客户端的真实IP地址,这对于许多应用场景都是非常有用的。同时,在实现过程中还需要注意处理各种特殊情况,确保获取到的数据准确无误,并且符合相关的安全与隐私规定。

    java获取ip地址示例

    需要注意的是,`X-Forwarded-For`头部可能存在被篡改的风险,因此在某些安全敏感的应用场景中,直接依赖这个头部获取IP可能不够安全。此外,不同的反向代理服务器可能有特定的配置,如Squid的`forwarded_for`选项,...

    idea,java获取ip地址

    在Java Web开发中,IntelliJ IDEA是一款广泛使用的集成开发环境(IDE),它为Java程序员提供了强大的代码编辑、调试和项目管理功能。当我们构建一个基于Servlet的Web应用程序时,有时需要获取访问用户的真实IP地址,...

    java实现根据ip地址获取地理位置

    在Java编程中,根据IP地址获取地理位置是一项常见的需求,尤其在大数据分析、用户行为追踪或者安全防护等场景中。本文将介绍如何利用新浪和淘宝的API接口来实现这一功能。 首先,我们来看新浪的接口实现。新浪提供...

    Java利用Request请求获取IP地址的方法详解

    在示例代码中,定义了一个名为`IpAdrressUtil`的工具类,其中有一个静态方法`getIpAdrress(HttpServletRequest request)`用于获取IP地址。这个方法首先尝试从以下HTTP头部获取IP: 1. `X-Real-IP`: 这个头部通常由...

Global site tag (gtag.js) - Google Analytics