首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SpringMVC 獲取手機唯一標識:基於 ARP 協議獲取 MAC 地址方案

     編輯:程式設計綜合問答

業務場景

構建 Web 手機簽到系統,需防止代簽。要求:學生連指定 WiFi 後訪問局域網 IP 簽到,後台識別手機唯一標識(MAC/IP),並判斷客戶端操作系統類型以防電腦模擬。

核心難點

  • HTTP 請求頭無直接提供 MAC 地址(隱私保護)。
  • 局域網環境下,伺服器可通過 ARP 表映射 IP 到 MAC。
  • 需跨平台支持(Windows/Linux 伺服器命令差異)。

解決方案:ARP 協議反查 MAC

  1. 獲取客戶端 IP:String ip = request.getRemoteAddr();
  2. 執行系統 arp 命令解析輸出:

Windows 環境實現

String macAdd = "";
String arpCMD = "arp -a ";
try {
    Process process = Runtime.getRuntime().exec(arpCMD + ip);
    InputStreamReader isr = new InputStreamReader(process.getInputStream());
    LineNumberReader reader = new LineNumberReader(isr);
    String line;
    while ((line = reader.readLine()) != null) {
        if (line.indexOf(ip) >= 0) {
            // 解析 "at" 後的 MAC 片段(視具體輸出格式調整索引)
            int atIdx = line.indexOf("at");
            if (atIdx > 0) {
                macAdd = line.substring(atIdx + 3, atIdx + 20).trim();
            }
            break;
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}
return macAdd;

Linux 環境調整

僅需將命令改為 arp -n,解析邏輯類似。

補充:客戶端 OS 判斷

通過 User-Agent 頭識別:

String ua = request.getHeader("User-Agent").toLowerCase();
boolean isMobile = ua.contains("android") || ua.contains("iphone") || ua.contains("mobile");
boolean isPC = ua.contains("windows") || ua.contains("macintosh") || ua.contains("linux x86");

注意事項與局限

  • 權限要求:伺服器進程需有執行 arp 權限(通常需 root/Administrator)。
  • ARP 表時效性:條目會老化,建議簽到前先 ping 一下客戶端 IP 刷新 ARP 表。
  • 跨子網失效:若客戶端與伺服器不在同一二層網段,ARP 無法跨路由器工作。
  • 隱私合規:收集 MAC 需用戶知情同意,符合 GDPR/個信法規定。

替代方案對比

方案優點缺點
ARP 反查 MAC無需客戶端配合,適用現有網絡依賴同網段、需高權限、Linux/Win 命令差異
WebRTC ICE 候選瀏覽器原生支持用戶可禁用、僅獲取本地 IP
App 端主動上報可獲取 IMEI/Android ID 等需安裝 App、iOS 限制嚴格

綜合考量,ARP 方案在「純 Web + 局域網 + 已有 WiFi 控制」場景下工程成本最低,但需做好異常處理與降級策略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved