`
yanguz123
  • 浏览: 570333 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

获取客户端真实IP地址

    博客分类:
  • Code
 
阅读更多

解析纯真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地址

    ### Java获取客户端真实IP地址详解 在Web开发中,获取客户端的真实IP地址是一个常见的需求,尤其是在需要进行地理位置定位、安全审计、流量统计等场景下。然而,在存在反向代理服务器的环境中,传统的`request....

    利用ASP获取客户端真实IP地址.doc

    【ASP获取客户端真实IP地址】 在互联网环境中,为了提供个性化的服务和防范恶意攻击,获取客户端的真实IP地址是一项基础且重要的任务。这篇文章主要探讨如何利用ASP(Active Server Pages)技术来实现这一目标。 *...

    获取客户端真实IP(支持代理服务器)

    通过上述方法,我们可以有效地解决在使用反向代理服务器时获取客户端真实IP地址的问题。需要注意的是,在处理`X-Forwarded-For`字段时,我们应该优先考虑获取第一个非`unknown`的IP地址,以确保获取到的IP地址尽可能...

    Java获取客户端真实IP地址过程解析

    Java获取客户端真实IP地址过程解析 Java获取客户端真实IP地址过程解析是指在服务器端获取客户端的真实IP地址的过程。该过程是非常重要的,因为在业务背景下,服务器端需要进行签名验证、客户端IP限定等拦截,而获取...

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

    ### Java获取客户端真实IP的两种方法详解 #### 一、问题背景 在Web开发中,经常需要获取客户端的真实IP地址来进行一系列的操作,比如统计访问来源、进行地理定位、安全防护等。然而,在实际应用场景中,客户端请求...

    java 获取客户端ip mac地址

    在Java Web开发中,有时我们需要获取客户端的IP地址甚至是MAC地址,以便进行安全验证、用户行为追踪等操作。本文将详细介绍如何通过Java来实现这一功能。 #### 一、获取客户端 IP 地址 获取客户端的IP地址通常在...

    PHP获取客户端真实IP地址的5种情况分析和实现代码

    这就给获取客户端真实IP地址带来了一定的难度。 #### 3. HTTP头信息与代理类型 HTTP头信息是客户端发送给服务器的一系列信息,其中包含了一些关于客户端和通信过程的详细信息。在PHP中,可以利用`$_SERVER`全局...

    JSP如何获取客户端真实IP地址

    此外,获取客户端真实IP地址的另一个注意事项是安全性问题。攻击者可能通过伪造X-Forwarded-For头部信息来进行IP欺骗。因此,在需要高安全性验证的场景下,依赖X-Forwarded-For头部信息时应当谨慎,并结合其他安全...

    java获取客户端ip及mac地址

    1. **获取 IP 地址**:使用 `request.getRemoteAddr()` 可能会获取到代理服务器的 IP 地址,而通过检查 `X-Forwarded-For` 请求头可以更准确地获取客户端的真实 IP 地址。 2. **获取 MAC 地址**:虽然可以通过执行...

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

    2. **获取客户端IP地址**:在Web应用中,服务器需要区分每个客户端,`IpUtils`可能会有方法处理`HttpServletRequest`对象,从HTTP请求头(如`X-Forwarded-For`或`RemoteAddr`)中解析出真实客户端的IP地址。...

    真正的获取客户端真实IP地址及利弊分析

    目前网上流行的所谓“取真实IP地址”的方法,都有bug,没有考虑到多层透明代理的情况。

    JS获取客户端IP地址、MAC和主机名的7个方法汇总

    将`0.0.0.0`替换为客户机的真实IP地址即可。 **应用场景**: - 适用于需要根据客户端IP地址进行地理定位的场景,如电商网站自动识别用户所在城市并提供相应服务。 --- #### 二、使用JS获取计算机名、MAC地址、...

    golang 获取客户端IP

    集成各种获取方式,获取正确的IP

    jsp页面得到客户端的真是ip

    ### JSP 页面获取客户端真实 IP 的方法 在 IT 领域中,了解客户端的真实 IP 地址对于网站统计...通过上述方法,我们可以有效地解决在 JSP 页面中获取客户端真实 IP 地址的问题,这对于开发人员来说是非常有用的技巧。

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

    但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。所以...

    .net获取客户端IP,Mac地址

    在.NET开发环境中,获取客户端的IP地址和MAC地址是常见的需求,这主要涉及到网络通信和系统编程的相关知识。本文将详细讲解如何在.NET中实现这一功能,并提供相关的代码示例。 首先,我们要明白IP地址和MAC地址的...

    JSP获取客户端IP地址浏览器版本操作系统.pdf

    在使用多级反向代理的情况下,`X-Forwarded-For`的值可能是一串IP值,我们需要取第一个非unknown的有效IP字符串作为客户端的真实IP地址。 获取浏览器版本和操作系统信息 我们可以使用`request.getHeader("User-...

    获取访问者真实的IP地址

    因此,准确地获取客户端真实IP地址变得尤为重要。 #### 二、HTTP头部信息 在HTTP请求中,可以通过以下几个头部字段来获取客户端IP地址: 1. **X-Forwarded-For**:通常被用作负载均衡器或者代理服务器传递原始...

    获取客户端ip

    ### 获取客户端真实IP地址 在Web开发中,获取客户端的真实IP地址是一项常见的需求。尤其是在存在代理服务器的情况下,传统的`request.getRemoteAddr()`方法可能无法直接获取到客户端的真实IP地址。本文将详细介绍...

Global site tag (gtag.js) - Google Analytics