不多说,不废话,直接上代码,大家都懂的

package com.cdsmartlink.utils.system;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

/**
* 获取系统的信息
* @author liuyazhuang
*
*/
public final class SystemUtils {
/**
* 获取访问者IP
* 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效。
*
* 本方法先从Header中获取X-Real-IP,如果不存在再从X-Forwarded-For获得第一个IP(用,分割),
* 如果还不存在则调用Request .getRemoteAddr()。
* @param request
* @return
*/
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("X-Real-IP");
if (ip!= null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
ip = request.getHeader("X-Forwarded-For");
if (ip!= null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
// 多次反向代理后会有多个IP值,第一个为真实IP。
int index = ip.indexOf(',');
if (index != -1) {
return ip.substring(0, index);
} else {
return ip;
}
} else {
return request.getRemoteAddr();
}
}

/**
* 获取来访者的浏览器版本
* @param request
* @return
*/
public static String getRequestBrowserInfo(HttpServletRequest request){
String browserVersion = null;
String header = request.getHeader("user-agent");
if(header == null || header.equals("")){
return "";
}
if(header.indexOf("MSIE")>0){
browserVersion = "IE";
}else if(header.indexOf("Firefox")>0){
browserVersion = "Firefox";
}else if(header.indexOf("Chrome")>0){
browserVersion = "Chrome";
}else if(header.indexOf("Safari")>0){
browserVersion = "Safari";
}else if(header.indexOf("Camino")>0){
browserVersion = "Camino";
}else if(header.indexOf("Konqueror")>0){
browserVersion = "Konqueror";
}
return browserVersion;
}

/**
* 获取系统版本信息
* @param request
* @return
*/
public static String getRequestSystemInfo(HttpServletRequest request){
String systenInfo = null;
String header = request.getHeader("user-agent");
if(header == null || header.equals("")){
return "";
}
//得到用户的操作系统
if (header.indexOf("NT 6.0") > 0){
systenInfo = "Windows Vista/Server 2008";
} else if (header.indexOf("NT 5.2") > 0){
systenInfo = "Windows Server 2003";
} else if (header.indexOf("NT 5.1") > 0){
systenInfo = "Windows XP";
} else if (header.indexOf("NT 6.0") > 0){
systenInfo = "Windows Vista";
} else if (header.indexOf("NT 6.1") > 0){
systenInfo = "Windows 7";
} else if (header.indexOf("NT 6.2") > 0){
systenInfo = "Windows Slate";
} else if (header.indexOf("NT 6.3") > 0){
systenInfo = "Windows 9";
} else if (header.indexOf("NT 5") > 0){
systenInfo = "Windows 2000";
} else if (header.indexOf("NT 4") > 0){
systenInfo = "Windows NT4";
} else if (header.indexOf("Me") > 0){
systenInfo = "Windows Me";
} else if (header.indexOf("98") > 0){
systenInfo = "Windows 98";
} else if (header.indexOf("95") > 0){
systenInfo = "Windows 95";
} else if (header.indexOf("Mac") > 0){
systenInfo = "Mac";
} else if (header.indexOf("Unix") > 0){
systenInfo = "UNIX";
} else if (header.indexOf("Linux") > 0){
systenInfo = "Linux";
} else if (header.indexOf("SunOS") > 0){
systenInfo = "SunOS";
}
return systenInfo;
}

/**
* 获取来访者的主机名称
* @param ip
* @return
*/
public static String getHostName(String ip){
InetAddress inet;
try {
inet = InetAddress.getByName(ip);
return inet.getHostName();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return "";
}

/**
* 命令获取mac地址
* @param cmd
* @return
*/
private 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 第二个命令的执行结果
*
*/

private 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地址,用上面的分隔符号表示
*
*/

private 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
*
*/

private 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
*
*/
private 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 macAddress = "";
macAddress = getMacInWindows(ip).trim();
if(macAddress==null||"".equals(macAddress)){
macAddress = getMacInLinux(ip).trim();
}
return macAddress;
}
}