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

Node.js 服務端解析 Request 請求:獲取 User-Agent 分析客戶端信息

     編輯:程式設計疑難解答

核心 API

Node.js 原生 `http` 模塊中,`request` 對象的 `headers` 屬性包含所有請求頭,鍵名**統一小寫**。

獲取 User-Agent

const http = require('http');

const server = http.createServer((req, res) => {
    // 直接訪問 headers 對象(鍵名小寫)
    const userAgent = req.headers['user-agent'];
    
    console.log('User-Agent:', userAgent);
    // 輸出示例: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...
    
    // 解析客戶端信息
    const clientInfo = parseUserAgent(userAgent);
    
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.end(JSON.stringify({
        userAgent,
        clientInfo,
        timestamp: new Date().toISOString()
    }));
});

server.listen(3000, () => {
    console.log('Server running on port 3000');
});

User-Agent 解析庫推薦

手寫正則解析極其複雜且難維護,強烈建議使用成熟庫:

1. ua-parser-js (最流行,瀏覽器/Node 通用)

const UAParser = require('ua-parser-js');

function parseUserAgent(uaString) {
    const parser = new UAParser(uaString);
    return {
        browser: parser.getBrowser(),     // {name: 'Chrome', version: '120.0.0', major: '120'}
        engine: parser.getEngine(),       // {name: 'Blink', version: '120.0.0'}
        os: parser.getOS(),               // {name: 'Windows', version: '10'}
        device: parser.getDevice(),       // {type: 'desktop', vendor: undefined, model: undefined}
        cpu: parser.getCPU()              // {architecture: 'amd64'}
    };
}

2. useragent (Node 專用,基於瀏覽器識別項數據庫)

const useragent = require('useragent');

function parseUserAgent(uaString) {
    const agent = useragent.parse(uaString);
    return {
        family: agent.family,      // 'Chrome'
        major: agent.major,        // '120'
        minor: agent.minor,        // '0'
        patch: agent.patch,        // '0'
        os: agent.os.toString(),   // 'Windows 10'
        device: agent.device.toString() // 'Desktop'
    };
}

Express 框架中獲取

const express = require('express');
const app = express();

app.get('/api/client-info', (req, res) => {
    // Express 同樣通過 req.headers
    const ua = req.headers['user-agent'];
    // 或 req.get('User-Agent') 不區分大小寫
    
    const info = parseUserAgent(ua);
    res.json({ userAgent: ua, ...info });
});

app.listen(3000);

完整請求頭常用字段

req.headers = {
    'host': 'localhost:3000',
    'user-agent': 'Mozilla/5.0...',
    'accept': 'text/html,application/xhtml+xml,...',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'accept-encoding': 'gzip, deflate, br',
    'connection': 'keep-alive',
    'upgrade-insecure-requests': '1',
    'cookie': 'sessionId=abc123; preference=dark',
    'referer': 'https://google.com/',
    'x-forwarded-for': '192.168.1.100'  // 代理/負載均衡傳遞真實 IP
}

獲取客戶端真實 IP

function getClientIP(req) {
    return req.headers['x-forwarded-for'] || 
           req.headers['x-real-ip'] || 
           req.connection.remoteAddress || 
           req.socket.remoteAddress ||
           (req.connection.socket ? req.connection.socket.remoteAddress : null);
}

實戰應用場景

  1. 設備適配:移動端返回輕量頁面/APP 下載引導
  2. 風控/反爬蟲:識別爬蟲 UA、模擬器、自動化工具
  3. 統計分析:瀏覽器/OS/設備分佈報表
  4. 兼容性降級:老舊瀏覽器返回 Polyfill 或降級體驗
  5. A/B 測試:根據設備類型分流

安全提示

⚠️ User-Agent **可偽造**,不可作為身份驗證或權限控制依據。僅用於統計、適配、風控輔助判斷。

核心代碼就一行:req.headers['user-agent'],配合 `ua-parser-js` 即可獲得結構化客戶端信息。

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