`
boli.jiang
  • 浏览: 46044 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用Java获取IP地址实例

阅读更多
现在在从事的工作出现了一个问题,偶尔会出现取不到ip的情况,搜索了一下,原来如下文所说
转自:http://developer.51cto.com/art/200906/130491.htm

使用Java获取IP地址实例

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

相关推荐

    java编程实现获取服务器IP地址及MAC地址的方法

    主要介绍了java编程实现获取机器IP地址及MAC地址的方法,实例分析了Java分别针对单网卡及多网卡的情况下获取服务器IP地址与MAC地址的相关技巧,需要的朋友可以参考下

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

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

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

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

    JAVA上百实例源码以及开源项目源代码

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

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

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

    JAVA编程百例(照着例子更容易!)

    实例42 获取计算机名称和IP地址 实例43 一对简单的服务器和客户端 实例44 多线程服务器 实例45 使用SMTP协议发送邮件 实例46 使用SMTP协议接收邮件 实例47 使用JAVAMAIL发送邮件 实例48 使用JAVAMAIL接收邮件 实例49...

    JAVA上百实例源码以及开源项目

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

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

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

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

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

    Java Application-J2SE实例基础程序

    Java可视化程序(用AWT组件实现登录对话框、托盘图标、记事本等); Java控制台程序(Java排序算法、外部调用exe文件、获取计算机名称和IP地址等)

    java范例开发大全

    实例270 获取计算机名与IP地址 534 实例271 获取网址的IP地址 535 实例272 判断两个网址的主机名是否一样 536 实例273 测试IP的类型 537 实例274 查找主机 538 实例275 主机所支持的协议 539 15.2 URL类的使用 540 ...

    JAVA 范例大全 光盘 资源

    实例110 获取IP地址和域名 306 实例111 获取网络资源(URL) 308 实例112 FTP文件传输模拟 311 实例113 自制浏览器 316 实例114 点对点通信(Socket基于TCP协议) 323 实例115 点对面通信(Socket基于TCP/IP...

    Java JDK实例宝典

    3 获取IP地址和域名 13. 4 HTTP客户端 13. 5 基本的Socket编程 13. 6 HTTP服务器 13. 7 一个支持多线程的服务器框架 13. 8 代理服务器 13. 9 Telnet客户端 13. 10 UDP编程 13. 11 ...

    Java范例开发大全(全书源程序)

    实例193 使用GregorianCalendar类获取系统的当前时间 326 实例194 使用SimpleDateFormat类获取系统的当前时间 329 实例195 显示某年某月某一周的信息 330 实例196 显示某年某月的信息 332 实例197 时间的设置与...

    java范例开发大全源代码

     实例193 使用GregorianCalendar类获取系统的当前时间 326  实例194 使用SimpleDateFormat类获取系统的当前时间 329  实例195 显示某年某月某一周的信息 330  实例196 显示某年某月的信息 332  实例197...

    Java从网络下载(获取)文件的小例子.rar

    Java从网络下载(获取)文件的小例子,Container container=getContentPane(); //得到容器  jtfUrl=new JTextField(18); //实例化地址输入框  jbGetFile=new JButton("取文件"); //实例化按钮  jlInfo=new ...

    Java范例开发大全 (源程序)

     实例193 使用GregorianCalendar类获取系统的当前时间 326  实例194 使用SimpleDateFormat类获取系统的当前时间 329  实例195 显示某年某月某一周的信息 330  实例196 显示某年某月的信息 332  实例197 ...

Global site tag (gtag.js) - Google Analytics