`
Jathon_hs
  • 浏览: 18005 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用Java获取IP地址实例

    博客分类:
  • Java
阅读更多

 

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

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

    经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.5q520.cn /index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

    于是可得出Java获取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

    于是可得出获得Java获取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

    转自http://developer.51cto.com/art/200906/130491.htm, 未经测试

 

分享到:
评论

相关推荐

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

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

    java获取ip地址

    ### Java获取IP地址知识点解析 在本篇文章中,我们将深入探讨如何使用Java语言来获取IP地址。这是一项在网络编程中非常基础且重要的技能,能够帮助开发者了解客户端或服务器的网络位置信息。以下是对给定文件中的...

    java 获取客户端ip mac地址

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

    Java使用SOAP获取webservice实例解析

    ### Java使用SOAP获取WebService实例解析 #### WebService简介 WebService是一种跨编程语言和操作系统平台的、在网络上进行数据交换的一种方式。它使用标准的Internet协议,如HTTP、XML、SOAP等来实现不同系统间的...

    获取IP地址实例代码

    在Java中,我们可以使用`java.net`包下的`InetAddress`类来获取IP地址: ```java import java.net.InetAddress; import java.net.UnknownHostException; public class Main { public static void main(String...

    JAVA100例之实例42 获取计算机名称和IP地址

    接下来,获取IP地址也是通过`InetAddress`类实现。有两种类型的IP地址:IPv4和IPv6。默认情况下,`getLocalHost()`会返回IPv4地址,但如果系统配置为优先使用IPv6,它可能返回IPv6地址。你可以通过以下方式分别获取...

    java获取IP地址

    在Java编程中,获取IP地址和MAC地址是网络通信中常见的需求。IP地址标识了网络上的唯一设备,而MAC地址则是物理网络接口的唯一标识。以下是对标题和描述中涉及的知识点的详细解释: 1. **获取客户端IP地址**: - ...

    java开发基于百度API,淘宝API和腾讯IP库(qqwry.dat),通过IP获取区域城市位置,经纬度获取城市地址,城市地址获取经纬度等信息实例

    该demo有多个JAVA实例,分别是基于:百度API,淘宝API和腾讯提供的IP库(qqwry.dat),开发的一个简单直接可以使用的web应用程序,通过Eclipse导入即可在Main方法中测试; 1.百度API已经提供测试ak密钥,实例中有:a....

    java根据IP获取城市代码

    总之,通过Java获取IP地址对应的城市代码涉及了数据库查询、网络请求等多个技术点。在实际开发中,我们需要根据项目需求、性能要求和成本考虑选择合适的实现方式。对于大型项目,可能会结合使用本地数据库和服务提供...

    根据IP地址获取经纬度

    在Java中,获取IP地址信息通常需要使用第三方库,如MaxMind的GeoIP数据库。GeoIPJava-1.2.8可能就是这个项目的某个版本,它提供了与MaxMind数据库交互的接口。MaxMind的GeoLite或GeoIP2数据库包含了全球IP地址与地理...

    Java实现IPV6地址查询

    2. **创建IPv6Bean对象**:为每个查询的IPv6地址创建一个`IPv6Bean`实例,存储IP地址本身以及后续查询得到的地理位置信息。 3. **执行查询**:在`IpV6Seeker`类中,实现一个方法,接受IPv6地址作为参数,使用ZX库的...

    Java 实例 - 获取指定主机的IP地址源代码+详细指导教程.zip

    以下将详细介绍Java获取IP地址的方法及相关的网络协议知识。 首先,我们需要理解网络协议的基本概念。在互联网中,数据传输依赖于各种网络协议,如TCP/IP(Transmission Control Protocol/Internet Protocol)协议...

    Java 获取系统信息,包括CPU使用率、硬盘大小、网卡状态、系统信息等

    本文将详细讲解如何利用Java获取CPU使用率、硬盘大小、网卡状态以及系统信息,并结合给定的文件资源进行讨论。 首先,我们需要引入一个名为Sigar(System Information Gatherer and Reporter)的库,它是一个跨平台...

    根据IP地址获取详细地址的java工具

    在IT行业中,网络编程是不可或缺的一...总的来说,获取IP地址的详细地理位置在Java中可以通过多种途径实现,包括利用内置的网络类、第三方数据库和API服务。理解和掌握这些技术对于开发与网络位置相关的应用至关重要。

    java使用siger 获取服务器硬件信息(CPU 内存 网络 io等)

    在实际使用中,你可能需要创建Siger库的实例,然后调用对应的获取方法。例如,获取CPU使用率: ```java CPUInfo cpuInfo = new CPUInfo(); double cpuUsage = cpuInfo.getCPUUsage(); ``` 同样,获取内存信息: ```...

    java源码包---java 源码 大量 实例

     可直接输入文件名或网络地址,但必需事先连入网络。 Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序  Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和...

    Java Application-J2SE实例基础程序

    Java的`java.net`包提供了获取本地主机名和IP地址的方法。`InetAddress.getLocalHost()`可以返回本地主机的`InetAddress`对象,从中我们可以获取主机名和IP地址。 总结来说,这个Java Application-J2SE实例基础程序...

    使用Java进行SNMP编程-SNMP4J-代码实例

    当学习这些代码实例时,读者应着重理解SNMP协议的基本概念、SNMP4J库的使用方法以及如何在Java程序中调用这些方法来执行具体的网络管理任务。这些知识能够帮助读者构建自己的SNMP监控工具或者集成SNMP功能到现有的...

    Java 实例 - 获取本机ip地址及主机名源代码+详细指导教程.zip

    在Java编程中,获取本机IP地址和主机名是常见的需求,这主要涉及到网络协议的交互。本实例将深入讲解如何使用Java实现这一功能,并提供详细的源代码和指导教程。以下是对这一主题的详尽解释。 首先,让我们理解IP...

Global site tag (gtag.js) - Google Analytics