package com.jrfmail.useroa.h5Action;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
/**
-
开发公司:北京金瑞帆科技有限公司
-
版权:北京金瑞帆科技有限公司
-
-
@Title: GetMacAddress.java
-
@Package com.jrfmail.useroa.h5Action
-
@Description: TODO(获取去客户端mac地址)
-
-
区分 责任人 日期 说明
-
创建 cmh 2021年4月12日
-
-
@author cmh
-
@version 1.0, 2021年4月12日
*/
public class GetMacAddress {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 目标ip,一般在局域网内
-
@param sourceString 命令处理的结果字符串
-
@param macSeparator mac分隔符号
-
@return 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);
if (sourceString.indexOf(ip) <= sourceString.lastIndexOf(matcher.group(1))) {
break; // 如果有多个IP,只匹配本IP对应的Mac.
}
}return result;
}
/**
- @param ip 目标ip
- @return Mac Address
*/
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;
}
/**
- @param ip 目标ip
- @return Mac Address
*/
public static String getMacInLinux(final 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;
}
/**
- 获取MAC地址
- @return 返回MAC地址
*/
public static String getMacAddress(String ip) {
//String ip = getIp(request);
if(StringUtils.isBlank(ip)) {
return “”;
}
String macAddress = “”;
macAddress = getMacInWindows(ip).trim();
if (macAddress == null || “”.equals(macAddress)) {
macAddress = getMacInLinux(ip).trim();
}
if(StringUtils.isNotBlank(macAddress)) {
macAddress = macAddress.replaceAll("-", “:”);
}
return macAddress;
}
/**
- @Title: getIp
- @Description: TODO(获取客户端ip)
- @author: cmh
- @date 2021年4月12日 下午3:23:57
- @param request
- @return
- @throws
*/
public static String getIp(HttpServletRequest request) {
String ip = request.getHeader(“X-Forwarded-For”);
if(StringUtils.isNotEmpty(ip) && !“unKnown”.equalsIgnoreCase(ip)){
//多次反向代理后会有多个ip值,第一个ip才是真实ip
int index = ip.indexOf(",");
if(index != -1){
return ip.substring(0,index);
}else{
return ip;
}
}
ip = request.getHeader(“X-Real-IP”);
if(StringUtils.isNotEmpty(ip) && !“unKnown”.equalsIgnoreCase(ip)){
return ip;
}
return request.getRemoteAddr();
}
public static void main(String[] args) {
System.out.println(getMacAddress(“115.171.170.58”));
}
}