Java如何获取客户端mac地址
作者:岸远水声微
在用户登录时,通过获取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; }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。