解析纯真IP数据库:http://www.iteye.com/topic/340548
参考:http://newleague.iteye.com/blog/858741
参考:http://elf8848.iteye.com/blog/324793
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.javapeixun.com.cn / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.javapeixun.com.cn /index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。
于是可得出获得客户端真实IP地址的方法一:
public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
可是当我访问http://www.5a520.cn /index.jsp/ 时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1 或 192.168.1.110了,而我访问http://192.168.1.110:2046/index.jsp 时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squid.conf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off 则:X-Forwarded-For: unknown
于是可得出获得客户端真实IP地址的方法二:
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;
}
可是,如果通过了多级反向代理的话,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
/** * 获得客户端真实IP地址 * @[author]param[/author] request * @return */ public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); ip = getTrueIp(ip); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); ip = getTrueIp(ip); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); ip = getTrueIp(ip); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); ip = getTrueIp(ip); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); ip = getTrueIp(ip); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); ip = getTrueIp(ip); } return ip; } /** * 取真实客户端IP,过滤代理IP * @[author]param[/author] ip * @return */ public static String getTrueIp(String ip){ if(ip == null || "".equals(ip))return null; if(ip.indexOf(",") != -1){ String[] ipAddr = StringUtil.split(ip, ","); for(int i=0; i<ipAddr.length; i++){ if(isIp(ipAddr[i].trim()) && !ipAddr[i].trim().startsWith("10.") && !ipAddr[i].trim().startsWith("172.16")){ return ipAddr[i].trim(); } } }else{ if(isIp(ip.trim()) && !ip.trim().startsWith("10.") && !ip.trim().startsWith("172.16")) return ip.trim(); } return null; }
相关推荐
### Java获取客户端真实IP地址详解 在Web开发中,获取客户端的真实IP地址是一个常见的需求,尤其是在需要进行地理位置定位、安全审计、流量统计等场景下。然而,在存在反向代理服务器的环境中,传统的`request....
【ASP获取客户端真实IP地址】 在互联网环境中,为了提供个性化的服务和防范恶意攻击,获取客户端的真实IP地址是一项基础且重要的任务。这篇文章主要探讨如何利用ASP(Active Server Pages)技术来实现这一目标。 *...
通过上述方法,我们可以有效地解决在使用反向代理服务器时获取客户端真实IP地址的问题。需要注意的是,在处理`X-Forwarded-For`字段时,我们应该优先考虑获取第一个非`unknown`的IP地址,以确保获取到的IP地址尽可能...
Java获取客户端真实IP地址过程解析 Java获取客户端真实IP地址过程解析是指在服务器端获取客户端的真实IP地址的过程。该过程是非常重要的,因为在业务背景下,服务器端需要进行签名验证、客户端IP限定等拦截,而获取...
### Java获取客户端真实IP的两种方法详解 #### 一、问题背景 在Web开发中,经常需要获取客户端的真实IP地址来进行一系列的操作,比如统计访问来源、进行地理定位、安全防护等。然而,在实际应用场景中,客户端请求...
在Java Web开发中,有时我们需要获取客户端的IP地址甚至是MAC地址,以便进行安全验证、用户行为追踪等操作。本文将详细介绍如何通过Java来实现这一功能。 #### 一、获取客户端 IP 地址 获取客户端的IP地址通常在...
这就给获取客户端真实IP地址带来了一定的难度。 #### 3. HTTP头信息与代理类型 HTTP头信息是客户端发送给服务器的一系列信息,其中包含了一些关于客户端和通信过程的详细信息。在PHP中,可以利用`$_SERVER`全局...
此外,获取客户端真实IP地址的另一个注意事项是安全性问题。攻击者可能通过伪造X-Forwarded-For头部信息来进行IP欺骗。因此,在需要高安全性验证的场景下,依赖X-Forwarded-For头部信息时应当谨慎,并结合其他安全...
1. **获取 IP 地址**:使用 `request.getRemoteAddr()` 可能会获取到代理服务器的 IP 地址,而通过检查 `X-Forwarded-For` 请求头可以更准确地获取客户端的真实 IP 地址。 2. **获取 MAC 地址**:虽然可以通过执行...
2. **获取客户端IP地址**:在Web应用中,服务器需要区分每个客户端,`IpUtils`可能会有方法处理`HttpServletRequest`对象,从HTTP请求头(如`X-Forwarded-For`或`RemoteAddr`)中解析出真实客户端的IP地址。...
目前网上流行的所谓“取真实IP地址”的方法,都有bug,没有考虑到多层透明代理的情况。
将`0.0.0.0`替换为客户机的真实IP地址即可。 **应用场景**: - 适用于需要根据客户端IP地址进行地理定位的场景,如电商网站自动识别用户所在城市并提供相应服务。 --- #### 二、使用JS获取计算机名、MAC地址、...
集成各种获取方式,获取正确的IP
### JSP 页面获取客户端真实 IP 的方法 在 IT 领域中,了解客户端的真实 IP 地址对于网站统计...通过上述方法,我们可以有效地解决在 JSP 页面中获取客户端真实 IP 地址的问题,这对于开发人员来说是非常有用的技巧。
但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。所以...
在.NET开发环境中,获取客户端的IP地址和MAC地址是常见的需求,这主要涉及到网络通信和系统编程的相关知识。本文将详细讲解如何在.NET中实现这一功能,并提供相关的代码示例。 首先,我们要明白IP地址和MAC地址的...
在使用多级反向代理的情况下,`X-Forwarded-For`的值可能是一串IP值,我们需要取第一个非unknown的有效IP字符串作为客户端的真实IP地址。 获取浏览器版本和操作系统信息 我们可以使用`request.getHeader("User-...
因此,准确地获取客户端真实IP地址变得尤为重要。 #### 二、HTTP头部信息 在HTTP请求中,可以通过以下几个头部字段来获取客户端IP地址: 1. **X-Forwarded-For**:通常被用作负载均衡器或者代理服务器传递原始...
### 获取客户端真实IP地址 在Web开发中,获取客户端的真实IP地址是一项常见的需求。尤其是在存在代理服务器的情况下,传统的`request.getRemoteAddr()`方法可能无法直接获取到客户端的真实IP地址。本文将详细介绍...