首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 解析 User-Agent 實戰:整合 uasparser 識別瀏覽器、作業系統與裝置

     編輯:Java 相關知識

User-Agent 字串包含豐富的客戶端資訊,但格式混亂、變體極多,手寫正則解析幾乎不可能維護。業界標準做法是使用 uasparser 庫,基於 UA Parser 專案 的正規化規則庫(YAML 格式),準確識別瀏覽器、OS、裝置類型。

環境準備

Maven 依賴(中央倉庫可用):

<dependency>
    <groupId>cz.mallat</groupId>
    <artifactId>uasparser</artifactId>
    <version>0.6.1</version>
</dependency>
<!-- 內部依賴 jregex,通常會傳遞引入 -->

核心工具類實作

import cz.mallat.uasparser.OnlineUpdater;
import cz.mallat.uasparser.UASparser;
import cz.mallat.uasparser.UserAgentInfo;
import java.io.IOException;

public class UserAgentUtil {
    /** 單例解析器,靜態區塊初始化載入規則庫 */
    private static final UASparser uasParser;

    static {
        try {
            // 從 JAR 內建資源載入,離線可用
            uasParser = new UASparser(OnlineUpdater.getVendoredInputStream());
        } catch (IOException e) {
            throw new ExceptionInInitializerError("User-Agent 解析器初始化失敗: " + e.getMessage());
        }
    }

    /** 解析 UA 字串,返回結構化資訊 */
    public static UserAgentInfo parse(String userAgent) {
        try {
            return uasParser.parse(userAgent);
        } catch (IOException e) {
            throw new RuntimeException("UA 解析失敗: " + userAgent, e);
        }
    }

    // 測試主程式
    public static void main(String[] args) {
        String ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
        UserAgentInfo info = parse(ua);
        
        System.out.println("原始 UA: " + ua);
        System.out.println("瀏覽器: " + info.getUaName());           // Chrome
        System.out.println("瀏覽器版本: " + info.getBrowserVersionInfo()); // 120.0.0.0
        System.out.println("瀏覽器家族: " + info.getUaFamily());     // Chrome
        System.out.println("作業系統: " + info.getOsName());         // Windows 10
        System.out.println("OS 家族: " + info.getOsFamily());        // Windows
        System.out.println("裝置類型: " + info.getDeviceType());     // Computer
        System.out.println("類型: " + info.getType());               // Browser
    }
}

關鍵 API 說明

方法說明範例輸出
getUaName()瀏覽器名稱Chrome, Firefox, Safari
getUaFamily()瀏覽器家族Chrome, Firefox, Safari
getBrowserVersionInfo()完整版本字串120.0.0.0
getOsName()作業系統完整名稱Windows 10, macOS 13.2, Android 13
getOsFamily()OS 家族Windows, macOS, Android, iOS
getDeviceType()裝置類型Computer, Mobile, Tablet, Bot
getType()客戶端類型Browser, Mobile Browser, Bot

進階應用場景

1. 瀏覽器相容性判斷

if ("IE".equals(info.getUaFamily()) && parseVersion(info.getBrowserVersionInfo()) < 11) {
    // 提示升級或降級體驗
}

2. 行動裝置適配

if ("Mobile".equals(info.getDeviceType())) {
    // 返回行動版頁面 / 觸控優化介面
}

3. 爬蟲識別與封鎖

if ("Bot".equals(info.getType()) || "Bot".equals(info.getDeviceType())) {
    // 記錄日誌、限流或返回 403
}

效能與維護建議

  • 單例模式:UASparser 線程安全,全應用僅需一個實例,避免重複載入規則庫。
  • 離線規則庫:OnlineUpdater.getVendoredInputStream() 讀取 JAR 內建 regexes.yaml,無網路依賴,啟動快、穩定。
  • 定期更新:uasparser 版本更新包含最新 UA 規則,建議每季升級一次依賴版本。
  • 快取熱點 UA:高併發場景可加入 Guava Cache 或 Caffeine 快取解析結果(UA 字串重複率極高)。

常見問題排查

解析結果為 Unknown / Other
該 UA 可能為新版瀏覽器、特殊嵌入式裝置或偽造字串。檢查 uasparser 版本是否最新,或向上游專案提交規則補充。
初始化拋出 IOException
確認 uasparser-x.x.x.jar 內包含 regexes.yaml,且類別路徑正確。若使用打包工具(如 Spring Boot fat jar),確保資源未被排除。
效能瓶頸
單次解析約 0.1-0.5ms。極高 QPS 下建議非同步解析或寫入日誌後離線分析,避免阻塞請求執行緒。

善用成熟的 UA 解析庫,能以極低成本獲得準確的客戶端畫像,支援精準的業務決策與安全防護。

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