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
}
}
| 方法 | 說明 | 範例輸出 |
|---|---|---|
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 |
if ("IE".equals(info.getUaFamily()) && parseVersion(info.getBrowserVersionInfo()) < 11) {
// 提示升級或降級體驗
}
if ("Mobile".equals(info.getDeviceType())) {
// 返回行動版頁面 / 觸控優化介面
}
if ("Bot".equals(info.getType()) || "Bot".equals(info.getDeviceType())) {
// 記錄日誌、限流或返回 403
}
UASparser 線程安全,全應用僅需一個實例,避免重複載入規則庫。OnlineUpdater.getVendoredInputStream() 讀取 JAR 內建 regexes.yaml,無網路依賴,啟動快、穩定。uasparser-x.x.x.jar 內包含 regexes.yaml,且類別路徑正確。若使用打包工具(如 Spring Boot fat jar),確保資源未被排除。善用成熟的 UA 解析庫,能以極低成本獲得準確的客戶端畫像,支援精準的業務決策與安全防護。