java获取本机的ip地址

  1. //[转]JAVA取本机ip地址的正确方法,ipv6有效   
  2.   
  3. //除普通环境,还能适用于多网卡的、Linux环境  
  4.   
  5. import java.net.Inet6Address;  
  6. import java.net.InetAddress;  
  7. import java.net.NetworkInterface;  
  8. import java.util.Enumeration;  
  9.   
  10. public class Test {  
  11.   
  12. public static void main(String[] args) throws Exception {  
  13.    Test t = new Test();  
  14.    t.getLocalIP();  
  15. }  
  16.   
  17. public void getLocalIP() throws Exception {  
  18.    Enumeration e1 = (Enumeration) NetworkInterface.getNetworkInterfaces();  
  19.    while (e1.hasMoreElements()) {  
  20.     NetworkInterface ni = (NetworkInterface) e1.nextElement();  
  21.     System.out.print(ni.getName());  
  22.     System.out.print(": ");  
  23.     Enumeration e2 = ni.getInetAddresses();  
  24.     while (e2.hasMoreElements()) {  
  25.      InetAddress ia = (InetAddress) e2.nextElement();  
  26.      if (ia instanceof Inet6Address)  
  27.       continue// omit IPv6 address  
  28.      System.out.print(ia.getHostAddress());  
  29.      if (e2.hasMoreElements()) {  
  30.       System.out.print(", ");  
  31.      }  
  32.     }  
  33.     System.out.print("\n");  
  34.    }  
  35. }  
  36. }  



  1. 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。   
  2. 如果使用了反向代理软件,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。  
  3.   
  4. 经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问 ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。  
  5.   
  6.     于是可得出获得客户端真实IP地址的方法一:  
  7.   
  8.   
  9. public String getRemortIP(HttpServletRequest request) {  
  10.   if (request.getHeader("x-forwarded-for") == null) {  
  11.    return request.getRemoteAddr();  
  12.   }  
  13.   return request.getHeader("x-forwarded-for");  
  14.  }   
  15.   
  16.   
  17. 可是当我访问  时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1 或 192.168.1.110了,而我访问 :2046/index.jsp 时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squid.conf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off  则:X-Forwarded-For: unknown  
  18.   
  19.     于是可得出获得客户端真实IP地址的方法二:  
  20.   
  21.   
  22. public String getIpAddr(HttpServletRequest request) {  
  23.        String ip = request.getHeader("x-forwarded-for");  
  24.        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  25.            ip = request.getHeader("Proxy-Client-IP");  
  26.        }  
  27.        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  28.            ip = request.getHeader("WL-Proxy-Client-IP");  
  29.        }  
  30.        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  31.            ip = request.getRemoteAddr();  
  32.        }  
  33.        return ip;  
  34.    }   
  35.   
  36.   
  37.     可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值,究竟哪个才是真正的用户端的真实IP呢?  
  38.   
  39.     答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。  
  40.   
  41.     如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100用户真实IP为: 192.168.1.110   


  1. try   {  
  2. InetAddress[]   ia   =   InetAddress.getAllByName(InetAddress.getLocalHost().getHostName());  
  3. for(int   i=0;i <ia.length;i++){  
  4. System.out.print(ia[i].getHostAddress().toString());  
  5. }  
  6. }   catch   (UnknownHostException   ex)   {  
  7. //   TODO   自动生成   catch   块  
  8. ex.printStackTrace();  
  9. }  
  10.   
  11.   
  12. public   String[]   getIpAddress(String   hostname)   throws   SocketException,UnknownHostException   {  
  13. String[]   get   =   null;  
  14. InetAddress[]   inetAddress   =   null;  
  15. if   (new   CommonConvert().isEmpty(hostname))   {hostname   =   "localhost ";}  
  16. inetAddress   =   Inet4Address.getAllByName(hostname.toLowerCase());  
  17. if   (inetAddress.length   >   0   &&   inetAddress   !=   null)   {  
  18. get   =   new   String[inetAddress.length];  
  19. for   (int   i   =   0;i <inetAddress.length;i++)   {  
  20. get[i]   =   inetAddress[i].getHostAddress();  
  21. }  
  22. }  
  23. return   get;  
  24. }  

  1. 使用request对象的以下三个方法可以得到相关的信息,不过如果中间有代理服务器的话,则不适用了。以下是API文档中的说明:  
  2.  String getRemoteAddr()   
  3.           Returns the Internet Protocol (IP) address of the client or last proxy that sent the request.  
  4.    
  5.  String getRemoteHost()   
  6.           Returns the fully qualified name of the client or the last proxy that sent the request.   
  7.   
  8.  int getRemotePort()   
  9.           Returns the Internet Protocol (IP) source port of the client or last proxy that sent the request.  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值