Java如何獲取客戶端mac地址
Java獲取客戶端mac地址
問題
項目中需要實現(xiàn)一個功能,在用戶登錄的時候,要求系統(tǒng)賬號和計算機(jī)綁定,只有綁定的賬號才可以登錄,并且每個賬號只能綁定一臺計算機(jī)。
解決方案
通過請求IP獲取mac地址,然后將賬號與mac地址進(jìn)行綁定。
代碼實現(xiàn)如下:
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機(jī)器上獲取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機(jī)器上獲取mac地址 public static String getMacInWindows(final String ip) { String result = ""; String[] cmd = {"cmd", "/c", "ping " + ip}; String[] another = {"cmd", "/c", "ipconfig -all"}; // 獲取執(zhí)行命令后的result String cmdResult = callCmd(cmd, another); // 從上一步的結(jié)果中獲取mac地址 result = filterMacAddress(ip, cmdResult, "-"); return result; } // 命令執(zhí)行 public static String callCmd(String[] cmd, String[] another) { String result = ""; String line = ""; try { Runtime rt = Runtime.getRuntime(); // 執(zhí)行第一個命令 Process proc = rt.exec(cmd); proc.waitFor(); // 執(zhí)行第二個命令 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); // 因計算機(jī)多網(wǎng)卡問題,截取緊靠IP后的第一個mac地址 int num = sourceString.indexOf(ip) - sourceString.indexOf(": "+result + " "); if (num>0&&num<300) { break; } } return result; }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Josephus環(huán)的四種解法(約瑟夫環(huán))基于java詳解
這篇文章主要介紹了Josephus環(huán)的四種解法(約瑟夫環(huán))基于java詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09PropertiesLoaderUtils 出現(xiàn)中文亂碼的解決方式
這篇文章主要介紹了PropertiesLoaderUtils 出現(xiàn)中文亂碼的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08java用LocalDateTime類獲取當(dāng)天時間、前一天時間及本周/本月的開始和結(jié)束時間
這篇文章主要給大家介紹了關(guān)于java使用LocalDateTime類獲取當(dāng)天時間、前一天時間及本周/本月的開始和結(jié)束時間的相關(guān)資料,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08JpaRepository如何實現(xiàn)增刪改查并進(jìn)行單元測試
這篇文章主要介紹了JpaRepository如何實現(xiàn)增刪改查并進(jìn)行單元測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11Mybatis-plus使用selectList查詢數(shù)據(jù)為null的問題及解決辦法
這篇文章主要介紹了Mybatis-plus使用selectList查詢數(shù)據(jù)為null的問題及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07