JAVA获取本机IP地址

前情提要:

在项目中,涉及到需要获取用户ip的情况。原本使用的是如下代码,程序本地运行结果是:0:0:0:0:0:0:0:1

String ip = request.getRemoteAddr();

后来修改为如下代码,运行结果为:192.168.253.1

 public static String getIpAddress(HttpServletRequest request){
		          
          String ipAddress = request.getHeader("x-forwarded-for");
          
          if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
              ipAddress = request.getHeader("Proxy-Client-IP");
          }
          if (ipAddress == null || ipAddress.length() == 0 || "unknow".equalsIgnoreCase(ipAddress)) {
              ipAddress = request.getHeader("WL-Proxy-Client-IP");
          }
         if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
             ipAddress = request.getRemoteAddr();
             
             if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){
                 //根据网卡获取本机配置的IP地址
                 InetAddress inetAddress = null;
                 try {
                     inetAddress = InetAddress.getLocalHost();
                 } catch (UnknownHostException e) {
                	 Log.error(e.getMessage());
         			 Log.info("异常信息:",e);
                 }
                 ipAddress = inetAddress.getHostAddress();
             }
         }
         
         //对于通过多个代理的情况,第一个IP为客户端真实的IP地址,多个IP按照','分割
         if(null != ipAddress && ipAddress.length() > 15){
             //"***.***.***.***".length() = 15
             if(ipAddress.indexOf(",") > 0){
                 ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
             }
         }
         
         return ipAddress;
     }

写代码前,先明确一些规则:

  • 127.xxx.xxx.xxx 属于"loopback" 地址,即只能你自己的本机可见,就是本机地址,比较常见的有127.0.0.1;
  • 192.168.xxx.xxx 属于private 私有地址(site local address),属于本地组织内部访问,只能在本地局域网可见。同样10.xxx.xxx.xxx、从172.16.xxx.xxx 到 172.31.xxx.xxx都是私有地址,也是属于组织内部访问;
  • 169.254.xxx.xxx 属于连接本地地址(link local IP),在单独网段可用
  • 从224.xxx.xxx.xxx 到 239.xxx.xxx.xxx 属于组播地址
  • 比较特殊的255.255.255.255 属于广播地址
  • 除此之外的地址就是点对点的可用的公开IPv4地址

思考:

1、我自己觉得两个方法都没有问题,看需求。

2、需求中的ip是作为主键存在的,所以如果是第一种方法的话,存在相同的情况就会产生冲突了。

3、0:0:0:0:0:0:0:1是ipv6的表现形式,对应ipv4来说相当于127.0.0.1,也就是本机

如果项目部署在本机win7系统,访问时是通过 localhost 来访问,

用java获取ip地址可能会出现该问题,这时获取的ip将是 0:0:0:0:0:0:0:1

要是机器在局域网中,访问时使用自己的ip访问,如 我的ip是 :192.168.123.156

访问url:http://192.168.123.156:8080/test

这时候请求会经过路由器转发,所以服务器获取的就是本机的局域网内ip,在java中获取的ip就是 192.168.123.156了

4、request.getRemoteAddr() 获取的值为0:0:0:0:0:0:0:1的原因及解决办法

最近在进行web开发时,在jsp页面获取服务器ip时,遇到了request.getRemoteAddr()获取的值为0:0:0:0:0:0:0:1,这是为什么呢,照道理讲,应该是127.0.0.1才对,为什么这个获取的值变成了ipv6了呢,而且我发现这种情况只有在服务器和客户端都在同一台电脑上才会出现(例如用localhost访问的时候才会出现),后来上网查了查原因,原来是/etc/hosts这个东西作怪(在windows上应该是C:\Windows\System32\drivers\etc\hosts这个文件),只需要注释掉文件中的 # ::1 localhost 这一行即可解决问题。另外localhost这个文件很有用,这里你可以添加自己的条目,例如添加 192.168.0.212 myweb 这样子,在浏览器中原来只能使用192.168.0.212来访问的,并可以使用myweb来进行替换。

如果还不能解决,本机访问的时候用127.0.0.1或本机ip代替localhost即可解决

你可能感兴趣的:(JAVA获取本机IP地址)