四、获取IP地址工具包
由于getHostAddress()方法在Linux下读取hosts文件获取的是127.0.0.1
InetAddress.getLocalHost().getHostAddress()
所以这里采用NetworkInterfaces + getInetAddresses来获取IP地址
import org.apache.commons.lang3.StringUtils; import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration; /**
* @Description 网络工具包
* @Author lay
* @Date 2019/01/23 14:13
*/
public class NetUtil {
private static volatile String ip = ""; /**
* 通过NetworkInterfaces + getInetAddresses 获取IP地址
* 注意:
* 1)本方法将获取第一个ipv4地址,如果系统存在如虚拟机等将会有多个ipv4地址可选,可能导致获取到虚拟机地址
* 2)由于该方法要遍历逻辑网络接口,是一个重量级方法,这里采用static来确保全局只获取一次
* 3)为防止当前JVM中多次调用并发耗费资源,这里采用类锁控制
* @return IP地址
* @throws BusinessException 获取系统IP失败,getNetworkInterfaces()如果发生IO异常
*/
public static String getHostAddress() {
// 如果已经获取到了直接返回
if (StringUtils.isNotEmpty(ip)) {
return ip;
}
synchronized (NetUtil.class) {
if (StringUtils.isNotEmpty(ip)) {
return ip;
}
// 枚举所有逻辑网络接口
Enumeration<NetworkInterface> en;
try {
en = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
throw new BusinessException(ReturnStatus.SC_INTERNAL_SERVER_ERROR, "获取网络逻辑接口发生IO异常", e);
}
// 遍历所有接口
a: while (en.hasMoreElements()) {
NetworkInterface networkInterface = en.nextElement();
// 遍历该接口的所有地址
for (Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses(); inetAddresses.hasMoreElements(); ) {
InetAddress inetAddress = inetAddresses.nextElement();
String address = inetAddress.getHostAddress();
// 排除ip6等其它选项
if (!address.contains("::") && !address.contains("0:0:") && !address.contains("fe80")) {
// 排除127
if (!inetAddress.isLoopbackAddress() && inetAddress.isSiteLocalAddress()) {
// 赋值到静态变量
ip = address;
// 取第一个即结束
break a;
}
}
}
}
}
if (StringUtils.isEmpty(ip)) {
throw new BusinessException(ReturnStatus.SC_INTERNAL_SERVER_ERROR, "未能获取本机IP,IP=" + ip);
}
return ip;
}
}
这种获取方式实际上也可能存在问题,如使用了VM或者docker之类的东西,那么获取的时候会获取到多个并且无法区分是不是本机的IP,所以这里只取了第一个IP即break到a的位置。使用的时候需要注意服务器环境是否会造成这样的影响
四、获取IP地址工具包的更多相关文章
- PHP 获取IP地址位置信息「聚合数据API」
聚合数据 提供了[查询IP所属区域]的服务接口,只需要以 GET 请求的方式向 API 传入 IP地址 和 APPKEY 即可获得查询结果. 这里的难点主要在于如何通过PHP获取客户端IP地址,以及如 ...
- DHCP获取IP地址过程中捕获的报文—三级网络总结(二)
上一篇文章主要说了一下知识点中的IP地址的考点,这一篇我打算说说DHCP获取IP地址过程中捕获的报文的这个考点,都是自己的理解,有错误欢迎指正. DHCP是应用层协议,UDP是传输层协议,IP是网络层 ...
- 转 .net 获取IP地址的三个方法的比较
获取用户IP地址的三个属性的区别(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR) 一.没有使用代理服务器的情况: REMOTE_ADDR = 您的 IP ...
- windows下获取IP地址的两种方法
windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...
- 【PHP开发篇】一个统计客户端商机提交的获取IP地址
1.对客服提交数据的ip地址记录. 获取ip地址的方法: public function getIP() { global $ip; if (getenv("HTTP_X_REAL_IP&q ...
- 获取 IP 地址
package j2se.core.net.base; import java.net.InetAddress;import java.net.UnknownHostException; public ...
- js获取IP地址方法总结_转
js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338.html 1,js取得IP地址 ...
- iOS 获取IP地址
一.获取本机IP地址 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #import <ifadd ...
- Linux下Python获取IP地址
<lnmp一键安装包>中需要获取ip地址,有2种情况:如果服务器只有私网地址没有公网地址,这个时候获取的IP(即私网地址)不能用来判断服务器的位置,于是取其网关地址用来判断服务器在国内还是 ...
随机推荐
- Redis持久化————AOF与RDB模式
1. 官方说明: By default Redis asynchronously dumps the dataset on disk. This mode is good enou ...
- Mac OS 10.12 - 解决“bad interpreter: No such file or directory”问题!
在Mac OS10.12里面执行shell脚本时候,无法执行,错误提示:“bad interpreter: No such file or directory”,经过上网搜索,最终解决了,解决方法,首 ...
- 《Python绝技:运用Python成为顶级黑客》 用Python进行无线网络攻击
本章大部分代码都是实现了但是缺乏相应的应用环境,想具体测试的可以直接找到对应的环境或者自行修改脚本以适应生活常用的环境. 1.搭建无线网络攻击环境: 用Scapy测试无线网卡的嗅探功能: 插入无线网卡 ...
- 在Linux CentOS上部署Asp.Net Core项目(Tengine、Asp.Net Core、Centos、MySql)
一.前言 1.简单记录一下Linux CentOS 7中安装与配置Tengine的详细步骤. 2.简单比较一下Tengine 和Nginx 3.搭建Asp.net Core和部署 Web程序 4.总结 ...
- P2149 Elaxia的路线
P2149 Elaxia的路线 题意简述: 在一个n(n<=1500)个点的无向图里找两对点之间的最短路径的最长重合部分,即在保证最短路的情况下两条路径的最长重合长度(最短路不为一) 思路: 两 ...
- POJ 2253
#include<iostream> #include<stdio.h> #include<math.h> #include<iomanip> #def ...
- (转)支持Multi Range Read索引优化
支持Multi Range Read索引优化 原文:http://book.51cto.com/art/201701/529465.htm http://book.51cto.com/art/2016 ...
- PHP 批量获取 百度搜索结果 网址列表
<?php set_time_limit(0); function curl($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $u ...
- jdk1.8以前不建议使用其自带的Base64来加解密
JDK1.8之前的base64是内部测试使用的代码,不建议生产环境使用,而且未来可能会移除, JDK1.8提供最新可以正式使用的Base64类, 不要使用JDK中自带的sun.misc.BASE64D ...
- PHP面向对象常见符号总结($this-> 、self ::)
转载:http://wyllife.blog.163.com/blog/static/4116390120116223528180/ 在php中常见的对象符号 1.$this this是指向当前对象的 ...