JAVA获取IP地址、电脑Mac地址

1、获取IP地址

注意:IP地址经过多次反向代理后会有多个IP值,其中第一个IP才是真实IP,所以不能通过
request.getRemoteAddr()获取IP地址,如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,
而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP才是用户真实IP地址。
public static String getIpAddress(HttpServletRequest request) {
        String ip = null;
        try {
            // 获取用户真是的地址
            String xip = request.getHeader("X-Real-IP");
            // 获取多次代理后的IP字符串值
            String xfor = request.getHeader("X-Forwarded-For");
            if (StringUtils.isNotEmpty(xfor) && !"unKnown".equalsIgnoreCase(xfor)) {
                // 多次反向代理后会有多个IP值,第一个用户真实的IP地址
                int index = xfor.indexOf(",");
                if (index >= 0) {
                    return xfor.substring(0, index);
                } else {
                    return xfor;
                }
            }
            ip = xip;
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ip;
    }

2、根据ip地址获取地终端的Mac地址

    /**
     * 根据ip地址获取地终端的Mac地址
     * @param ip IP地址
     * @return  终端的Mac地址
     */
    public static String getMacAddress(String ip){
        String macAddress = "";
        // 1、获取Windows
        macAddress = getMacInWindows(ip).trim();

        // 2、如果为空,以Linux方式获取
        if(macAddress==null||"".equals(macAddress)){
            macAddress = getMacInlinux(ip).trim();
        }

        // 3、转大写后放回
        return macAddress.toUpperCase();
    }

    /**
     * 以Windows方式获取Mac地址
     * @param ip IP地址
     * @return 终端的Mac地址
     */
    public static String getMacInWindows(final String ip){
        String result = "";
        String[] cmd = {"cmd", "/c", "ping " + ip};
        String[] another = {"cmd", "/c", "arp -a"};
        String cmdResult = callCmd(cmd,another);
        result = filterMacAddress(ip,cmdResult,"-");

        return result;
    }

    /**
     * 以Linux方式获取Mac地址
     * @param ip IP地址
     * @return 终端的Mac地址
     */
    public static String getMacInlinux( String ip){
        String result = "";
        String[] cmd = {"/bin/sh","-c","ping " + ip + " -c 2 && arp -a"};
        String cmdResult = callCmd(cmd);
        result = filterMacAddress(ip,cmdResult,":");

        return result;
    }

    /**
     * 执行命令
     * @param cmd 可执行命令
     * @return 命令的执行结果
     */
    public static String callCmd(String[] cmd) {
        String result = "";
        String line = "";
        try {
            Process proc = Runtime.getRuntime().exec(cmd);
            InputStreamReader is = new InputStreamReader(proc.getInputStream());
            BufferedReader br = new BufferedReader (is);
            while ((line = br.readLine ()) != null) {
                result += line;
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 执行命令
     * @param cmd 第一个命令
     * @param another 第二个命令
     * @return 命令的执行结果
     */
    public static String callCmd(String[] cmd,String[] another) {
        String result = "";
        String line = "";
        try {
            Runtime rt = Runtime.getRuntime();
            Process proc = rt.exec(cmd);
            // 已经执行完第一个命令,准备执行第二个命令
            proc.waitFor();
            proc = rt.exec(another);
            InputStreamReader is = new InputStreamReader(proc.getInputStream());
            BufferedReader br = new BufferedReader (is);
            while ((line = br.readLine ()) != null) {
                result += line;
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 最终过滤
     * @param ip
     * @param sourceString
     * @param macSeparator
     * @return
     */
    public static String filterMacAddress(final String ip, final String sourceString,final String macSeparator) {
        String result = "";
        String regExp = "((([0-9,A-F,a-f]{1,2}" + macSeparator + "){1,5})[0-9,A-F,a-f]{1,2})";
        Pattern pattern = Pattern.compile(regExp);
        Matcher matcher = pattern.matcher(sourceString);
        while(matcher.find()){
            result = matcher.group(1);
            // 如果有多个IP,只匹配本IP对应的Mac.
            if(sourceString.indexOf(ip) <= sourceString.lastIndexOf(matcher.group(1)){
                break;
            }
        }
        return result;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值