前置条件:首先要能够ping通要获取MAC地址的电脑A(如果不能ping通可能原因是防火墙没关)
获取MAC地址原理:
1、首先获取A的IP地址,
2、然后ping这个IP,ping通之后,
3、然后再调用”arp -a IP地址”命令,获取到A的MAC地址(此时获取到的MAC地址是字母都是小写的)
4、将小写字母转为大写
代码:
/**
* 1、首先获取A的IP地址
* @param request
* @return ip
* @throws Exception
*/
public String getIp(HttpServletRequest request) throws Exception{
String ip = request.getHeader("X-Forwarded-For");
if(ip!=null){
if(!ip.isEmpty()&&!"unKnown".equalsIgnoreCase(ip)){
int index = ip.indexOf(",");
if (index != -1){
return ip.substring(0,index);
}else{
return ip;
}
}
}
ip = request.getHeader("X-Real-IP");
if(ip!=null){
if (!ip.isEmpty()&&!"unKnown".equalsIgnoreCase(ip)){
return ip;
}
}
return request.getRemoteAddr();
}
/**
* 通过访问的Ip地址得到mac地址
* @param ip
* @return mac
*/
public String getMacByIp(String ip){
String result = "";
try {
result = command("ping "+ip+" -n 2"); //2、然后ping这个IP
if(result.contains("TTL")){
result = command("arp -a "+ip); //3、然后再调用arp -a命令
}
} catch (Exception e) {
e.printStackTrace();
}
String regExp = "([0-9A-Fa-f]{2})([-:][0-9A-Fa-f]{2}){5}"; //正则表达式检测MAC地址是否合法
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(result);
StringBuilder mac = new StringBuilder();
while (matcher.find()) {
String temp = matcher.group();
mac.append(temp);
}
return mac.toString().toUpperCase(); //4、将小写字母转为大写
}