Java如何获取客户端mac地址

 更新时间:2024年09月27日 10:15:11   作者:岸远水声微  
在用户登录时,通过获取IP地址来识别计算机的MAC地址,然后将用户账号与该MAC地址进行绑定,确保每个账号只能在一台特定的计算机上登录,增强系统安全性,这种方法适用于需要严格账户安全管理的场景

Java获取客户端mac地址

问题

项目中需要实现一个功能,在用户登录的时候,要求系统账号和计算机绑定,只有绑定的账号才可以登录,并且每个账号只能绑定一台计算机。

解决方案

通过请求IP获取mac地址,然后将账号与mac地址进行绑定。

代码实现如下:

String getMacInfo(HttpServletRequest request)
    {
        //获取ip地址
        String macInfo = null;
        try
        {
            String ip = request.getRemoteAddr();
            //linux下获取mac地址
            macAddr = CommonUtils.getMac(ip);
            //windows下获取mac地址
            if(StringUtils.isBlank(macAddr)){
                macAddr = CommonUtils.getMacInWindows(ip).trim();
            }
        }
        catch (Exception e)
        {
            log.error("获取mac地址失败");
            return null;
        }
        return macInfo;
    }

CommonUtils.java

	// 从类unix机器上获取mac地址
	 public static String getMac(String ip) throws IOException {
        String mac = SysCode.BDFH.EMPTY;
        if (ip != null) {
            try {
                Process process = Runtime.getRuntime().exec("arp "+ip);
                InputStreamReader ir = new InputStreamReader(process.getInputStream());
                LineNumberReader input = new LineNumberReader(ir);
                String line;
                StringBuffer s = new StringBuffer();
                while ((line = input.readLine()) != null) {
                    s.append(line);
                }
                mac = s.toString();
                if (StringUtils.isNotBlank(mac)) {
                    mac = mac.substring(mac.indexOf(":") - 2, mac.lastIndexOf(":") + 3);
                }
                return mac;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return mac;
    }
    
    // 从windows机器上获取mac地址
	public static String getMacInWindows(final String ip) {
        String result = "";
        String[] cmd = {"cmd", "/c", "ping " + ip};
        String[] another = {"cmd", "/c", "ipconfig -all"};
        // 获取执行命令后的result
        String cmdResult = callCmd(cmd, another);
        // 从上一步的结果中获取mac地址
        result = filterMacAddress(ip, cmdResult, "-");
        return result;
 	}
 	
 	// 命令执行
 	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;
    }
	
	// 获取mac地址
	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后的第一个mac地址
            int num = sourceString.indexOf(ip) - sourceString.indexOf(": "+result + " ");
            if (num>0&&num<300) {
                break;
            }
        }
        return result;
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring中Service注入多个实现类的方法详解

    Spring中Service注入多个实现类的方法详解

    这篇文章主要介绍了Spring中Service注入多个实现类的方法详解,Spring是一个开源的Java框架,用于构建企业级应用程序,它提供了许多功能,如依赖注入、面向切面编程、数据访问、Web开发等,需要的朋友可以参考下
    2023-07-07
  • Java8实现优雅的获取重复字符与次数

    Java8实现优雅的获取重复字符与次数

    这篇文章主要为大家详细介绍了在Java8中,我们应该如何进行字符及字符串的去重,以及计算去重次数,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2023-12-12
  • 详解Spring如何解决循环引用的问题

    详解Spring如何解决循环引用的问题

    在Spring框架中,当两个或多个Bean之间存在相互依赖关系时,可能会导致循环引用的问题,循环引用指的是两个或多个Bean之间互相依赖,形成一个循环链,本文将和大家一起探讨Spring如何解决循环引用的问题,感兴趣的小伙伴跟着小编一起来看看吧
    2023-08-08
  • Java 配置加载机制详解及实例

    Java 配置加载机制详解及实例

    这篇文章主要介绍了Java 配置加载机制详解及实例的相关资料,需要的朋友可以参考下
    2016-09-09
  • SpringBoot开启虚拟线程的实现流程

    SpringBoot开启虚拟线程的实现流程

    虚拟线程(Virtual Thread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,本文给大家介绍了SpringBoot如何开启虚拟线程,需要的朋友可以参考下
    2024-06-06
  • 详解RSA加密算法的原理与Java实现

    详解RSA加密算法的原理与Java实现

    这篇文章主要和大家分享非对称加密中的一种算法,那就是 RSA 加密算法。本文介绍了RSA算法的原理与Java实现,感兴趣的小伙伴可以尝试一下
    2022-10-10
  • 在Java中实现可见性(visibility)的主要方法详解

    在Java中实现可见性(visibility)的主要方法详解

    这篇文章主要介绍了在Java中实现可见性(visibility)的主要方法详解,在Java中,使用关键字volatile和使用锁(如synchronized关键字或 java.util.concurrent包中的锁)来确保对共享变量的修改在多线程环境中能够正确地被其他线程所观察到,需要的朋友可以参考下
    2023-08-08
  • SpringBoot整合PowerJob实现定时任务调度

    SpringBoot整合PowerJob实现定时任务调度

    最近项目需要使用定时任务,而使用了PowerJob做任务调度模块,感觉这个框架真香,今天我们就来深入了解一下新一代的定时任务框架——PowerJob,需要的朋友可以参考下
    2024-03-03
  • kotlin java 混合代码 maven 打包实现

    kotlin java 混合代码 maven 打包实现

    这篇文章主要介绍了kotlin java 混合代码 maven 打包实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • java eclipse 中文件的上传和下载示例解析

    java eclipse 中文件的上传和下载示例解析

    这篇文章主要介绍了eclipse java中文件的上传和下载示例解析,文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的。对此感兴趣的小伙伴可以了解一下
    2020-07-07

最新评论