因为接口的加密需要校验请求服务器的公网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;
    }
}
最后修改:2021 年 12 月 10 日
给我一点小钱钱也很高兴啦!o(* ̄▽ ̄*)ブ