有关ip工具类

简介: 有关ip工具类


image.png

在项目中有很多关于ip的操作,以下博主将这些方法编辑成工具类供大家使用。

private static final String UNKNOWN = "unknown";
    //本地IP
    private static final String LOCAL_IP = "127.0.0.1";
    //服务器IP
    private static String SERVER_IP = null;
    /**
     * 获取客户单IP地址
     */
    public static String getClientIp(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        if (StringUtils.equalsIgnoreCase("0:0:0:0:0:0:0:1", ip)) {
            ip = LOCAL_IP;
        }
        return ip;
    }
    /**
     * @param ip
     * @return
     */
    public static boolean noInternet(String ip) {
        return !isInternet(ip);
    }
    /**
     * 判定是否是内网地址
     *
     * @param ip
     * @return
     */
    public static boolean isInternet(String ip) {
        if (StringUtils.isEmpty(ip)) {
            return false;
        }
        if (StringUtils.equals("0:0:0:0:0:0:0:1", ip)) {
            return true;
        }
        Pattern reg = Pattern.compile("^(127\\.0\\.0\\.1)|(localhost)|(10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})|(172\\.((1[6-9])|(2\\d)|(3[01]))\\.\\d{1,3}\\.\\d{1,3})|(192\\.168\\.\\d{1,3}\\.\\d{1,3})$");
        Matcher match = reg.matcher(ip);
        return match.find();
    }
    /**
     * 获取服务器端的IP
     */
    public static String getServerIp() {
        if (StringUtils.isNotEmpty(SERVER_IP)) {
            return SERVER_IP;
        }
        try {
            Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();
            while (allNetInterfaces.hasMoreElements()) {
                NetworkInterface netInterface = allNetInterfaces.nextElement();
                String name = netInterface.getName();
                if (!StringUtils.contains(name, "docker") && !StringUtils.contains(name, "lo")) {
                    Enumeration<InetAddress> addresses = netInterface.getInetAddresses();
                    while (addresses.hasMoreElements()) {
                        InetAddress ip = addresses.nextElement();
                        //loopback地址即本机地址,IPv4的loopback范围是127.0.0.0 ~ 127.255.255.255
                        if (ip != null
                                && !ip.isLoopbackAddress()
                                && !ip.getHostAddress().contains(":")) {
                            SERVER_IP = ip.getHostAddress();
                            break;
                        }
                    }
                }
            }
        } catch (Exception e) {
            SERVER_IP = LOCAL_IP;
        }
        return SERVER_IP;
    }


相关文章
|
1月前
|
Java
Java 些许公共工具类
Java 些许公共工具类
15 1
|
3月前
|
Android开发
SharePreference封装成工具类
SharePreference封装成工具类
128 1
|
6月前
|
存储 Java
Java动态转发代理IP的实现方法
Java动态转发代理IP的实现方法
290 11
java代码实现使用网络地址下载文件
java代码实现使用网络地址下载文件
211 0
|
6月前
|
Java Python
设置代理ip——java
设置代理ip——java
|
6月前
|
存储 安全 Java
深入解析Java List接口及其实现类
深入解析Java List接口及其实现类
123 1
|
Java
Java如何获取请求的ip 地址?
Java如何获取请求的ip 地址
204 0
|
存储 Java 数据库
【Java】封装的实现,访问限定符、包
【Java】封装的实现,访问限定符、包
127 0
【Java】封装的实现,访问限定符、包
|
Java API
Java:SpringBoot获取所有接口的路由映射关系
Java:SpringBoot获取所有接口的路由映射关系
571 0
Java HttpClient 如何使用代理IP请求接口
Java HttpClient 如何使用代理IP请求接口