因为接口的加密需要校验请求服务器的公网IP,起初是将IP地址用字符串的形式写死的。后面考虑到有多个服务器和对应IP地址,如果后续更换服务器再更改代码也比较麻烦,所以想到用动态获取的方式实现。然而如果采用第三方的公网IP获取接口势必会产生请求延迟,会影响到业务的正常进行。而工具类只能获取到内网IP,所以想到先获取本机的内网IP,然后手动绑定内网IP所对应的公网IP。
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
public class IP {
public static void main(String[] args) {
System.out.println(getLIp()); //打印本机内网IP对应的公网IP地址
}
private static String getLIp() {
String ipv4 = getHostIp();
String[] localIP = ipv4.split("\\.");
String lastIP = localIP[3];
Map<String, String> map = new HashMap<String, String>();
// kay对应取内网IP最后一位 例如:127.0.0.1 取 1 进行匹配value。
map.put("01", "221.225.0.1");
map.put("02", "221.225.0.2");
map.put("03", "221.225.0.3");
return map.get(lastIP);
}
private static String getHostIp(){
try{
Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();
while (allNetInterfaces.hasMoreElements()){
NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();
Enumeration<InetAddress> addresses = netInterface.getInetAddresses();
while (addresses.hasMoreElements()){
InetAddress ip = (InetAddress) addresses.nextElement();
if (ip != null
&& ip instanceof Inet4Address
&& !ip.isLoopbackAddress() //loopback地址即本机地址,IPv4的loopback范围是127.0.0.0 ~ 127.255.255.255
&& ip.getHostAddress().indexOf(":")==-1){
return ip.getHostAddress();
}
}
}
}catch(Exception e){
e.printStackTrace();
}
return null;
}
}