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

Java 獲取客戶端信息:User-Agent 解析、作業系統、瀏覽器、IP 與 Servlet 核心屬性

     編輯:Java 相關知識

Servlet 請求對象攜帶豐富的客戶端環境信息。本文系統匯總 HttpServletRequest 核心屬性獲取方法、User-Agent 解析策略、真實 IP 提取、跨語言對比 (ASP.NET/PHP/JS) 及生產環境注意事項。

核心屬性一鍵獲取工具類


public final class ClientInfoExtractor {
    public static ClientInfo extract(HttpServletRequest request) {
        ClientInfo info = new ClientInfo();
        
        // 1. User-Agent 原始字符串
        String ua = request.getHeader("User-Agent");
        info.setUserAgent(ua);
        
        // 2. 解析瀏覽器與作業系統 (簡易版,生產建議用 ua-parser)
        if (ua != null) {
            info.setBrowser(parseBrowser(ua));
            info.setOs(parseOs(ua));
        }
        
        // 3. Servlet 標準屬性
        info.setMethod(request.getMethod());
        info.setRequestURI(request.getRequestURI());
        info.setServletPath(request.getServletPath());
        info.setServerName(request.getServerName());
        info.setServerPort(request.getServerPort());
        info.setRemoteAddr(request.getRemoteAddr());      // 直接客戶端 IP (可能是代理)
        info.setRemoteHost(request.getRemoteHost());      // 客戶端主機名
        info.setProtocol(request.getProtocol());          // HTTP/1.1
        info.setScheme(request.getScheme());              // http/https
        info.setQueryString(request.getQueryString());
        info.setAuthType(request.getAuthType());
        info.setContentLength(request.getContentLengthLong());
        info.setContentType(request.getContentType());
        info.setCharacterEncoding(request.getCharacterEncoding());
        info.setSessionId(request.getRequestedSessionId());
        
        // 4. 所有 Header (調試用)
        Map headers = new HashMap<>();
        Enumeration names = request.getHeaderNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement();
            headers.put(name, request.getHeader(name));
        }
        info.setHeaders(headers);
        
        return info;
    }
    
    // 簡易解析示例 (生產請用 ua-parser-js / Yauaa)
    private static String parseBrowser(String ua) {
        if (ua.contains("Edg/")) return "Edge";
        if (ua.contains("Chrome/")) return "Chrome";
        if (ua.contains("Firefox/")) return "Firefox";
        if (ua.contains("Safari/")) return "Safari";
        if (ua.contains("MSIE") || ua.contains("Trident")) return "IE";
        return "Unknown";
    }
    
    private static String parseOs(String ua) {
        if (ua.contains("Windows NT 10.0")) return "Windows 10/11";
        if (ua.contains("Windows NT 6.3")) return "Windows 8.1";
        if (ua.contains("Windows NT 6.1")) return "Windows 7";
        if (ua.contains("Mac OS X")) return "macOS";
        if (ua.contains("Linux")) return "Linux";
        if (ua.contains("Android")) return "Android";
        if (ua.contains("iPhone") || ua.contains("iPad")) return "iOS";
        return "Unknown";
    }
}

Servlet 核心屬性完整速查表

方法返回類型含義典型值
getMethod()StringHTTP 方法GET, POST, PUT, DELETE
getRequestURI()String請求 URI (含 context path)/myapp/api/users
getRequestURL()StringBuffer完整請求 URL (不含查詢串)https://host:8080/myapp/api/users
getServletPath()String匹配的 Servlet 路徑/api/users
getPathInfo()String額外路徑信息/123/detail
getQueryString()String查詢字符串page=1&size=20
getRemoteAddr()String客戶端 IP (直接連接者)192.168.1.100
getRemoteHost()String客戶端主機名 (DNS 反解)client.example.com
getRemoteUser()String認證用戶 principaljohn_doe
getAuthType()String認證方案BASIC, FORM, CLIENT_CERT
getProtocol()String協議版本HTTP/1.1
getScheme()String協議方案http, https
getServerName()String服務器主機名localhost
getServerPort()int服務器端口8080
getContentType()String請求體 MIME 類型application/json
getContentLengthLong()long請求體長度1024
getCharacterEncoding()String請求體編碼UTF-8
getRequestedSessionId()String客戶端攜帶的 Session IDJSESSIONID=abc123
getHeader(name)String單個 Header 值見下表
getHeaders(name)Enumeration多值 HeaderCookie, X-Forwarded-For
getHeaderNames()Enumeration所有 Header 名稱遍歷調試

常見 Header 速查

Header獲取方法用途
User-Agentrequest.getHeader("User-Agent")客戶端標識、瀏覽器/OS 統計
Refererrequest.getHeader("Referer")來源頁面、防盜鏈、CSRF 檢查
Acceptrequest.getHeader("Accept")內容協商
Accept-Languagerequest.getHeader("Accept-Language")國際化語言偏好
Accept-Encodingrequest.getHeader("Accept-Encoding")響應壓縮 (gzip, br)
Cookierequest.getHeader("Cookie")原始 Cookie 字符串
Authorizationrequest.getHeader("Authorization")Bearer Token、Basic Auth
X-Forwarded-Forrequest.getHeader("X-Forwarded-For")真實客戶端 IP (代理鏈路)
X-Real-IPrequest.getHeader("X-Real-IP")Nginx 透傳真實 IP
X-Request-Idrequest.getHeader("X-Request-Id")分布式追蹤 ID

跨語言獲取 User-Agent 對比

語言/平台獲取方式
Java Servletrequest.getHeader("User-Agent")
ASP.NET CoreRequest.Headers["User-Agent"] 或 Request.Headers.UserAgent
ASP.NET FrameworkRequest.UserAgent 或 Request.Headers["User-Agent"]
PHP$_SERVER['HTTP_USER_AGENT']
Node.js (Express)req.get('User-Agent') 或 req.headers['user-agent']
Python (Flask/Django)request.headers.get('User-Agent') / request.META['HTTP_USER_AGENT']
Go (net/http)r.Header.Get("User-Agent")
JavaScript (瀏覽器)navigator.userAgent

生產級 User-Agent 解析:引入專業庫

手寫正則不可維護,推薦:

Yauaa 快速上手



    nl.basjes.parse.useragent
    yauaa
    7.3.0


// 使用
UserAgentAnalyzer analyzer = UserAgentAnalyzer.newBuilder().build();
UserAgent agent = analyzer.parse(request.getHeader("User-Agent"));
String browser = agent.getValue(UserAgent.BROWSER_NAME);      // Chrome
String version = agent.getValue(UserAgent.BROWSER_VERSION);   // 119.0.0.0
String os = agent.getValue(UserAgent.OPERATING_SYSTEM_NAME);  // Windows 10
String device = agent.getValue(UserAgent.DEVICE_CLASS);       // Desktop

真實 IP 提取最佳實踐 (重申)


public static String getRealIp(HttpServletRequest request) {
    String ip = request.getHeader("X-Forwarded-For");
    if (isValidIp(ip)) return ip.split(",")[0].trim();
    
    ip = request.getHeader("X-Real-IP");
    if (isValidIp(ip)) return ip;
    
    return request.getRemoteAddr();
}

private static boolean isValidIp(String ip) {
    return ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip);
}

前提:Nginx/網關必須正確配置透傳,且應用層**只信任**受信代理層設置的 Header。

JSP 調試頁面模板


<%@ page import="java.util.*,javax.servlet.http.*" %>
<%
    out.println("Protocol: " + request.getProtocol() + "
"); out.println("Scheme: " + request.getScheme() + "
"); out.println("Server: " + request.getServerName() + ":" + request.getServerPort() + "
"); out.println("Remote: " + request.getRemoteAddr() + " / " + request.getRemoteHost() + "
"); out.println("Method: " + request.getMethod() + "
"); out.println("URI: " + request.getRequestURI() + "
"); out.println("Query: " + request.getQueryString() + "
"); out.println("UA: " + request.getHeader("User-Agent") + "
"); out.println("Referer: " + request.getHeader("Referer") + "
"); out.println("X-Forwarded-For: " + request.getHeader("X-Forwarded-For") + "
"); out.println("All Headers:
"); Enumeration e = request.getHeaderNames(); while (e.hasMoreElements()) { String n = e.nextElement(); out.println(" " + n + " = " + request.getHeader(n) + "
"); } %>

總結

  1. 核心屬性用 HttpServletRequest 標準 API 獲取,Header 用 getHeader/getHeaders。
  2. User-Agent 解析**必須**用專業庫 (Yauaa/ua-parser-js),勿手寫正則。
  3. 真實 IP 依賴反向代理正確透傳 `X-Forwarded-For`/`X-Real-IP`,應用層做兜底。
  4. 跨語言獲取方式大同小異,均為從請求 Header 讀取。
  5. 敏感信息 (Cookie、Authorization) 日誌脫敏,避免洩露。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved