request/RequestUtil.js

'use strict';

const ArrayUtil = require("../array/ArrayUtil");
const NetUtil = require("../net/NetUtil");
/**
 *
 *
 * https://gitee.com/yichengxian/testing-express/blob/main/testing-common/util/ClientUtil.js
 * @author ycx
 * @description 请求工具类
 */
class RequestUtil {

    /**
     *
     * 获取客户端ip
     *
     * @param request {Request} request对象
     * @param otherHeaderNames {string} 另外的header数组 可选
     * @return {string} 客户端IP
     */
    static getClientIp(request,...otherHeaderNames){
        //常见的ip头
        const headers = [
            "X-Forwarded-For",
            "X-Real-IP",
            "Proxy-Client-IP",
            "WL-Proxy-Client-IP",
            "HTTP_CLIENT_IP",
            "HTTP_X_FORWARDED_FOR"
        ];
        if (ArrayUtil.isNotEmpty(otherHeaderNames)){
            otherHeaderNames.forEach(value => headers.push(value))
        }
        return this.getClientIpByHeaders(request,otherHeaderNames);
    }


    /**
     * 获取客户端IP
     * @param request {Request} 请求头
     * @param otherHeaderNames {string} 其他header数组
     * @return {string} 客户端IP
     */
    static getClientIpByHeaders(request,...otherHeaderNames){
        //
        let ip;
        //循环遍历获取头
        for (let otherHeaderName of otherHeaderNames) {
            if (!NetUtil.isUnknown(ip = request.headers[otherHeaderName])) {
                ip = NetUtil.getMultistageReverseProxyIp(ip);
                return ip;
            }
        }

        // return req.headers['x-forwarded-for'] || // 判断是否有反向代理 IP
        //         req.connection.remoteAddress || // 判断 connection 的远程 IP
        //         req.socket.remoteAddress || // 判断后端的 socket 的 IP
        //         req.connection.socket.remoteAddress;
        ip = request.ip
            || request._remoteAddress
            ||  request.socket.remoteAddress || request.connection.socket.remoteAddress
            || request.connection && request.connection.remoteAddress;

        return NetUtil.getMultistageReverseProxyIp(ip);
    }
}
module.exports = RequestUtil;