系统信息获取java工具类SystemUtil

系统信息工具类SystemUtil

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;

/**
 * 获取系统的信息
 */
public final class SystemUtil {

        /**
         * 命令获取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;
        }

        /**
         * 获取访问地址的IP
         */
        public static String getHostAddress(HttpServletRequest request) {
                String ipAddr = "";
                InetAddress address = null;
                try {
                        String serverName = request.getServerName();
                        if (isboolIp(serverName)) {
                                ipAddr = serverName;
                        } else {
                                address = InetAddress.getByName(serverName);
                                ipAddr = address.getHostAddress();
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
                return ipAddr;
        }

        /**
         * 获取来访者的主机名称
         *
         * @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 "";
        }

        /**
         * 获取访问者IP 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效。
         * <p>
         * 本方法先从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();
                }
        }

        /**
         * 获取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;
        }

        /**
         * @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;
        }

        /**
         * @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 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 6.0") > 0) {
                        browserVersion = "IE 6";
                } else if (header.indexOf("MSIE 7.0") > 0) {
                        browserVersion = "IE 7";
                } else if (header.indexOf("MSIE 8.0") > 0) {
                        browserVersion = "IE 8";
                } else if (header.indexOf("MSIE 9.0") > 0) {
                        browserVersion = "IE 9";
                } else if (header.indexOf("MSIE 10.0") > 0) {
                        browserVersion = "IE 10";
                } else if (header.indexOf("rv:11.0") > 0) {
                        browserVersion = "IE 11";
                } 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 10.0") > 0) {
                        systenInfo = "Windows 10";
                } 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;
        }

        /**
         * 判断是否为合法IP * @return the ip
         */
        public static boolean isboolIp(String ipAddress) {
                String ip = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}";
                Pattern pattern = Pattern.compile(ip);
                Matcher matcher = pattern.matcher(ipAddress);
                return matcher.matches();
        }

        public static void main(String[] args) {
                InetAddress address = null;
                try {
                        address = InetAddress.getByName("f0rb.iteye.com");
                } catch (UnknownHostException e) {
                        e.printStackTrace();
                        System.out.println("获取失败");
                }
                System.out.println(address.getHostAddress());
        }
}