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

获取真实IP地址

阅读更多
转载:http://blog.sina.com.cn/s/blog_407a68fc01000ai7.html


在JSP里,获取客户端的IP地址的方法是: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地址和原来客户端请求的服务器地址。当我们访问http://www.xxx.com/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.xxx.com/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


种方法不一定100%准,网上很多人提到要准确的话必须做一个客户端空间,如applet。
分享到:
评论

相关推荐

    ASP如何获取真实IP地址

    ### ASP如何获取真实IP地址 在ASP(Active Server Pages)编程环境中,开发人员经常会遇到一个需求:需要准确地获取客户端的真实IP地址。然而,在实际应用中,由于许多用户可能通过代理服务器来访问网站,这就导致...

    C#获取真实IP地址实现方法

    总的来说,C#中获取真实IP地址的关键在于处理`HTTP_X_FORWARDED_FOR`头信息,并且需要考虑代理服务器的层次。同时,对于IP地址的处理和存储,可以利用类库提供的方法进行转换,以确保数据的准确性和兼容性。在实际...

    GetIpAddress.rar_GetIPAddress_获取IP地址_获取真实IP

    另一方面,获取真实IP地址有时需要考虑到CDN(内容分发网络)和代理服务器的影响,因为它们可能会改变请求头中的IP信息。为了获取准确的地理位置信息,可能需要使用第三方IP库或API,例如MaxMind的GeoIP数据库或...

    Java获取客户端真实IP地址

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

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

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

    第六节 收集真实IP地址信息-01

    如果目标服务器使用了CDN,那么需要绕过CDN来获取真实IP地址。有多种方法可以绕过CDN,例如: 1. 内部邮箱源:可以收集到内部邮箱服务器的IP地址。 2. 网站phpinfo文件:可以通过phpinfo.php文件来获取真实IP地址。...

    获取真实IP

    获取真实IP地址是互联网应用中的一项基本需求,但面对复杂的网络环境,尤其是多层透明代理的情况下,简单的解决方案往往难以满足需求。通过深入了解代理协议、利用自定义中间件、结合第三方服务等多种手段,可以有效...

    C#获取真实IP地址(IP转为长整形、判断是否内网IP的方法)

    在C#编程中,获取真实IP地址是一项常见的需求,特别是在处理网络请求时,需要区分公网IP和内网IP。在给定的文件中,我们看到了几种实现这一目标的方法,包括将IP地址转换为长整型以及判断IP是否为内网或私有地址。 ...

    JSP 获取真实IP地址的代码

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

    获取用户真实IP地址

    本篇文章将详细介绍如何在不同情况下获取用户的真实IP地址,并探讨可能遇到的问题。 首先,最常见的方法是在HTTP请求头中查找“X-Real-IP”或“X-Forwarded-For”字段。这些字段通常由代理服务器设置,用于传递原始...

    android获取IP地址,运营商名称以及位置信息

    android获取IP地址,运营商名称以及位置信息,比较实用的小工具,可以用到代码中。 IP:是利用 jstun 包获取的。 ISP:是利用 sina webservice 获取的。 有错请指正。

    获取访问者真实的IP地址

    在现代Web应用开发过程中,获取客户端的真实IP地址是一项非常重要的功能。这不仅可以帮助我们分析用户行为、优化服务,还能用于安全防护,例如防止恶意攻击等场景。本文将详细介绍如何通过Java Web应用中的JSP技术...

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

    然而,在实际应用中,很多情况下用户的请求会经过反向代理服务器(如Nginx、Squid等),这使得直接使用`request.getRemoteAddr()`方法获取到的IP地址往往并不是客户端的真实IP地址。 #### 二、问题分析 当客户端...

    获取用户真实IP地址,不使用request.getRemoteAddr()的原因是有可能用户使用了代理软件方式避免真实IP地址

    获取请求接口的真实ip 地址工具类。适合所有Java开发人员。针对接口的ip 地址的获取。

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

    // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址 String headerName = "x-forwarded-for"; String ip = request.getHeader(headerName); if (null != ip && ip.length() != 0 && !"unknown...

    IP地址HTTP请求工具类

    获取本地IP地址,获取本地Host名称,获取Linux下的IP地址,获取用户真实IP地址,get/post请求 相应的工具类

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

    在Web开发中,经常需要获取客户端的真实IP地址来进行一系列的操作,比如统计访问来源、进行地理定位、安全防护等。然而,在实际应用场景中,客户端请求往往经过了多级代理(如Apache、Squid等),这使得直接使用`...

    CDN获取真实IP

    ### CDN获取真实IP 在互联网应用中,内容分发网络(Content Delivery Network,简称CDN)是一种广泛采用的技术,用于加速网站内容的加载速度、提高访问稳定性和安全性。然而,当用户通过CDN访问网站时,服务器接收...

    PHP不同环境下获取真实的IP.txt

    在Web开发过程中,获取客户端的真实IP地址是一项非常重要的功能,尤其是在需要根据用户地理位置进行服务定制、防止恶意攻击、统计分析等场景下。然而,由于不同的服务器环境配置和代理服务器的存在,直接通过`$_...

Global site tag (gtag.js) - Google Analytics