【獲取IP】多層代理後,出現獲取是IP列表,導致一些支付平臺的ip錯誤、或者Sign錯誤

1、使用下面的代碼獲取實際IP的時候 會出現 IP清單【49.77.233.222, 140.205.253.100

 /**
     * 獲取ip地址,防止集羣、代理
     * 
     * @param request
     * @return ip
     */
    public static String getAddr(HttpServletRequest request)
    {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getRemoteAddr();
        }
       
    }

2、其實這個由於多層代理所致,第一個是用戶的對外公網IP,第二個是某一層的代理IP,比如阿里雲的CDN 的CNAME服務器,或者獨立的Apache Nginx代理服務器


3、只返回用戶的正式IP,獲取第一個

/**
     * 獲取ip地址,防止集羣、代理
     * 
     * @param request
     * @return ip
     */
    public static String getAddr(HttpServletRequest request)
    {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getRemoteAddr();
        }
        // 解決出現多層代理,返回第一個作爲實際IP地址
        if (MoShopUtil.isNotEmpty(ip))
        {
            String[] ips = ip.split(",");
            if (ips.length > 0)
            {
                return ips[0].trim();
            }
        }
        return ip;
    }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章