国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot如何通過(guò)Nginx代理獲取真實(shí)IP

這篇具有很好參考價(jià)值的文章主要介紹了SpringBoot如何通過(guò)Nginx代理獲取真實(shí)IP。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

springboot作為后臺(tái)代碼,獲取到的登錄IP是前臺(tái)的代理服務(wù)器地址,并不是用戶的真實(shí)IP地址,讓我們?cè)谧鼋y(tǒng)計(jì)的時(shí)候無(wú)從下手。下面是一個(gè)后臺(tái)獲取IP地址的類,本質(zhì)上沒(méi)有什么問(wèn)題,問(wèn)題在于,Nginx給你的就是一個(gè)代理之后的地址,所以你當(dāng)然獲取不到真實(shí)的地址了。

package com.**.common.core.utils.ip;

import java.net.InetAddress;
import java.net.UnknownHostException;
import javax.servlet.http.HttpServletRequest;
import com.**.common.core.utils.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;

/**
 * 獲取IP方法
 * 
 * @author Hxhh
 */
public class IpUtils
{
    /**
     * 獲取客戶端IP
     * 
     * @param request 請(qǐng)求對(duì)象
     * @return IP地址
     */
    public static String getIpAddr(HttpServletRequest request)
    {
        if (request == null)
        {
            return "unknown";
        }
        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("X-Forwarded-For");
        }
        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.getHeader("X-Real-IP");
        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getRemoteAddr();
        }

        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip);
    }

    public static String getIpAddr(ServerHttpRequest request) {
        HttpHeaders headers = request.getHeaders();
        String ip = headers.getFirst("x-forwarded-for");
        if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
            // 多次反向代理后會(huì)有多個(gè)ip值,第一個(gè)ip才是真實(shí)ip
            if (ip.indexOf(",") != -1) {
                ip = ip.split(",")[0];
            }
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = headers.getFirst("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = headers.getFirst("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = headers.getFirst("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = headers.getFirst("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = headers.getFirst("X-Real-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddress().getAddress().getHostAddress();
        }
        return ip;
    }


    /**
     * 檢查是否為內(nèi)部IP地址
     * 
     * @param ip IP地址
     * @return 結(jié)果
     */
    public static boolean internalIp(String ip)
    {
        byte[] addr = textToNumericFormatV4(ip);
        return internalIp(addr) || "127.0.0.1".equals(ip);
    }

    /**
     * 檢查是否為內(nèi)部IP地址
     * 
     * @param addr byte地址
     * @return 結(jié)果
     */
    private static boolean internalIp(byte[] addr)
    {
        if (StringUtils.isNull(addr) || addr.length < 2)
        {
            return true;
        }
        final byte b0 = addr[0];
        final byte b1 = addr[1];
        // 10.x.x.x/8
        final byte SECTION_1 = 0x0A;
        // 172.16.x.x/12
        final byte SECTION_2 = (byte) 0xAC;
        final byte SECTION_3 = (byte) 0x10;
        final byte SECTION_4 = (byte) 0x1F;
        // 192.168.x.x/16
        final byte SECTION_5 = (byte) 0xC0;
        final byte SECTION_6 = (byte) 0xA8;
        switch (b0)
        {
            case SECTION_1:
                return true;
            case SECTION_2:
                if (b1 >= SECTION_3 && b1 <= SECTION_4)
                {
                    return true;
                }
            case SECTION_5:
                switch (b1)
                {
                    case SECTION_6:
                        return true;
                }
            default:
                return false;
        }
    }

    /**
     * 將IPv4地址轉(zhuǎn)換成字節(jié)
     * 
     * @param text IPv4地址
     * @return byte 字節(jié)
     */
    public static byte[] textToNumericFormatV4(String text)
    {
        if (text.length() == 0)
        {
            return null;
        }

        byte[] bytes = new byte[4];
        String[] elements = text.split("\\.", -1);
        try
        {
            long l;
            int i;
            switch (elements.length)
            {
                case 1:
                    l = Long.parseLong(elements[0]);
                    if ((l < 0L) || (l > 4294967295L))
                    {
                        return null;
                    }
                    bytes[0] = (byte) (int) (l >> 24 & 0xFF);
                    bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
                    bytes[3] = (byte) (int) (l & 0xFF);
                    break;
                case 2:
                    l = Integer.parseInt(elements[0]);
                    if ((l < 0L) || (l > 255L))
                    {
                        return null;
                    }
                    bytes[0] = (byte) (int) (l & 0xFF);
                    l = Integer.parseInt(elements[1]);
                    if ((l < 0L) || (l > 16777215L))
                    {
                        return null;
                    }
                    bytes[1] = (byte) (int) (l >> 16 & 0xFF);
                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
                    bytes[3] = (byte) (int) (l & 0xFF);
                    break;
                case 3:
                    for (i = 0; i < 2; ++i)
                    {
                        l = Integer.parseInt(elements[i]);
                        if ((l < 0L) || (l > 255L))
                        {
                            return null;
                        }
                        bytes[i] = (byte) (int) (l & 0xFF);
                    }
                    l = Integer.parseInt(elements[2]);
                    if ((l < 0L) || (l > 65535L))
                    {
                        return null;
                    }
                    bytes[2] = (byte) (int) (l >> 8 & 0xFF);
                    bytes[3] = (byte) (int) (l & 0xFF);
                    break;
                case 4:
                    for (i = 0; i < 4; ++i)
                    {
                        l = Integer.parseInt(elements[i]);
                        if ((l < 0L) || (l > 255L))
                        {
                            return null;
                        }
                        bytes[i] = (byte) (int) (l & 0xFF);
                    }
                    break;
                default:
                    return null;
            }
        }
        catch (NumberFormatException e)
        {
            return null;
        }
        return bytes;
    }

    /**
     * 獲取IP地址
     * 
     * @return 本地IP地址
     */
    public static String getHostIp()
    {
        try
        {
            return InetAddress.getLocalHost().getHostAddress();
        }
        catch (UnknownHostException e)
        {
        }
        return "127.0.0.1";
    }

    /**
     * 獲取主機(jī)名
     * 
     * @return 本地主機(jī)名
     */
    public static String getHostName()
    {
        try
        {
            return InetAddress.getLocalHost().getHostName();
        }
        catch (UnknownHostException e)
        {
        }
        return "未知";
    }

    /**
     * 從多級(jí)反向代理中獲得第一個(gè)非unknown IP地址
     *
     * @param ip 獲得的IP地址
     * @return 第一個(gè)非unknown IP地址
     */
    public static String getMultistageReverseProxyIp(String ip)
    {
        // 多級(jí)反向代理檢測(cè)
        if (ip != null && ip.indexOf(",") > 0)
        {
            final String[] ips = ip.trim().split(",");
            for (String subIp : ips)
            {
                if (false == isUnknown(subIp))
                {
                    ip = subIp;
                    break;
                }
            }
        }
        return ip;
    }

    /**
     * 檢測(cè)給定字符串是否為未知,多用于檢測(cè)HTTP請(qǐng)求相關(guān)
     *
     * @param checkString 被檢測(cè)的字符串
     * @return 是否未知
     */
    public static boolean isUnknown(String checkString)
    {
        return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
    }
}

那么如何識(shí)別客戶端的真實(shí)IP呢,需要通過(guò)兩種方式去判斷:

1、沒(méi)有代理
如果只是普通的web項(xiàng)目的話,通過(guò) request.getRemoteAddr(); (HttpServletRequest 類型) 即可獲取到客戶端的真實(shí)IP

2、Nginx代理
在有代理的情況下,由于任何請(qǐng)求首先經(jīng)過(guò)Nginx,故通過(guò)request.getRemoteAddr()獲取的其實(shí)是Nginx的IP,并非真實(shí)的客戶端IP;此時(shí)通過(guò)x-forwarded-for獲取的IP為:"客戶端,代理1,代理2,..."或者"偽造IP,客戶端,代理1,代理2,...",故不能獲取到準(zhǔn)確的客戶端IP,此時(shí)需要配置Nginx TCP客戶端連接的真實(shí)IP,通過(guò)代理配置獲取真實(shí)IP,可以通過(guò)$remote_addr獲取客戶端IP,Nginx配置如下:

location / {
   //追加如下代碼
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header Host $host;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
}


?然后服務(wù)端通過(guò): request.getHeader("X-Real-IP"); ? ?即可獲取到客戶端的真實(shí)IP文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-797915.html

到了這里,關(guān)于SpringBoot如何通過(guò)Nginx代理獲取真實(shí)IP的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • nginx如何獲取真實(shí)客戶端ip

    nginx作為反向代理服務(wù)器,即代理我們的服務(wù)端,下面介紹下如何配置nginx獲取真實(shí)的客戶端ip 1、配置nginx.con 2、在java程序中可以通過(guò)如下方式獲?。?這樣就可以打印出真實(shí)ip了!即request.getHeader(\\\"X-Real-IP\\\")的值 引用: 查看端口占用及釋放所占用的端口_查詢谷歌瀏覽器的端口

    2024年02月11日
    瀏覽(16)
  • nestjs:nginx反向代理服務(wù)器后如何獲取請(qǐng)求的ip地址

    問(wèn)題: ? ? ? ? 如題 參考: ????????nodejs+nginx獲取真實(shí)ip-騰訊云開發(fā)者社區(qū)-騰訊云 ????????「轉(zhuǎn)」從限流談到偽造 IP nginx remote_addr ? ? ? ?? 解決辦法: 1.設(shè)置nginx ? ? ? ? 對(duì)于代理部分,對(duì)http header添加Host、X-Real-IP、X-Forwarded-For(最重要) ???????? 2.nestjs使用

    2024年02月13日
    瀏覽(23)
  • 如何通過(guò)nginx反向代理實(shí)現(xiàn)不同域名映射到同一臺(tái)服務(wù)器的相同端口

    要在Nginx中實(shí)現(xiàn)不同域名映射到同一臺(tái)服務(wù)器的相同端口,您可以使用Nginx的代理轉(zhuǎn)發(fā)技術(shù)。 首先,您需要了解Nginx的代理轉(zhuǎn)發(fā)工作原理。Nginx的代理轉(zhuǎn)發(fā)是指在代理服務(wù)器(proxy server)收到一個(gè)請(qǐng)求時(shí),先將請(qǐng)求轉(zhuǎn)發(fā)給目標(biāo)服務(wù)器(target server),然后將服務(wù)器的響應(yīng)返回給代

    2024年02月13日
    瀏覽(20)
  • nginx配置獲取真實(shí)ip

    要想在應(yīng)用中獲取到真實(shí)IP,取決于各個(gè)轉(zhuǎn)發(fā)節(jié)點(diǎn)的傳遞配置, 第一、要確定客戶端使用哪個(gè)請(qǐng)求頭傳遞IP地址 第二、第一轉(zhuǎn)發(fā)點(diǎn), proxy_set_header field value value是變量值,來(lái)源于請(qǐng)求方 field是變量名,是要發(fā)給下一站的變量 注意這個(gè)順序,set設(shè)置要發(fā)往下一站的變量,緊接著

    2024年02月11日
    瀏覽(21)
  • 如何通過(guò)nginx代理實(shí)現(xiàn)外網(wǎng)訪問(wèn)內(nèi)網(wǎng)mysql或oracle數(shù)據(jù)庫(kù)

    如何通過(guò)nginx代理實(shí)現(xiàn)外網(wǎng)訪問(wèn)內(nèi)網(wǎng)mysql或oracle數(shù)據(jù)庫(kù)

    ????????項(xiàng)目開發(fā)部署中經(jīng)常會(huì)遇到MySQL或Oracle數(shù)據(jù)庫(kù)安裝在內(nèi)網(wǎng),而我們的應(yīng)用服務(wù)只能部署在外網(wǎng),如果實(shí)現(xiàn)外網(wǎng)服務(wù)訪問(wèn)連接內(nèi)網(wǎng)的數(shù)據(jù)庫(kù)呢?本次介紹如何通過(guò)Nginx配置實(shí)現(xiàn)外網(wǎng)訪問(wèn)內(nèi)網(wǎng)數(shù)據(jù)庫(kù)。 1、前置機(jī)服務(wù)器 ? ? ? ? 首先要保證有一臺(tái)前置機(jī)服務(wù)器既可以訪

    2024年02月15日
    瀏覽(19)
  • nginx獲取客戶端真實(shí)ip

    在nginx中獲取客戶端真實(shí)IP的方法有多種,以下是其中兩種常用的方法: 使用nginx的access_log模塊記錄請(qǐng)求日志,并在日志中包含客戶端的真實(shí)IP信息。例如: 在上述配置中,通過(guò)使用http_x_forwarded_for字段來(lái)獲取客戶端的真實(shí)IP地址。如果該字段不存在或不合法,則使用remote_ad

    2024年02月16日
    瀏覽(48)
  • nginx配置獲取客戶端的真實(shí)ip

    場(chǎng)景描述: 訪問(wèn)路徑: A機(jī)器 - B機(jī)器的 -C虛擬機(jī) : A機(jī)器為客戶端用戶,本地地址為 192.168.0.110 B機(jī)器為服務(wù)端反向代理服務(wù)器 本地地址為192.168.0.128 –(192.168.56.1) C機(jī)器為B主機(jī)安裝的linux虛擬機(jī),并安裝了nginx ,本地ip為**(192.168.56.10)** 從側(cè)面反映了反向代理的好處,直

    2024年02月05日
    瀏覽(24)
  • nginx 獲取客戶端真實(shí)IP

    網(wǎng)站接入Web應(yīng)用防火墻WAF(Web Application Firewall)后,訪問(wèn)請(qǐng)求在到達(dá)源站服務(wù)器之前,需要經(jīng)過(guò)WAF的代理轉(zhuǎn)發(fā)。這種情況下,源站服務(wù)器可以通過(guò)解析回源請(qǐng)求中的X-Forwarded-For記錄,獲取客戶端的真實(shí)IP。 WAF在將客戶端的訪問(wèn)請(qǐng)求轉(zhuǎn)發(fā)到下一環(huán)節(jié)的服務(wù)器時(shí),會(huì)在HTTP的請(qǐng)求頭

    2023年04月09日
    瀏覽(34)
  • Java-通過(guò)IP獲取真實(shí)地址

    Java-通過(guò)IP獲取真實(shí)地址

    最近寫了一個(gè)日志系統(tǒng),需要通過(guò)訪問(wèn)的 IP 地址來(lái)獲取真實(shí)的地址,并且存到數(shù)據(jù)庫(kù)中,我也是在網(wǎng)上看了一些文章,遂即整理了一下供大家參考。 這個(gè)是獲取正確 IP 地址的方法,可以直接使用的。 通過(guò)以上方法你可以獲取到訪問(wèn)者的 IP 地址,只有獲取到了 IP 地址,才能

    2024年02月15日
    瀏覽(27)
  • Nginx(二十) 獲取真實(shí)客戶端IP

    ????????客戶端在訪問(wèn)互聯(lián)網(wǎng)應(yīng)用服務(wù)器時(shí),與真實(shí)的應(yīng)用服務(wù)器之間會(huì)因?yàn)橛卸鄬臃聪虼?,而?dǎo)致真實(shí)應(yīng)用服務(wù)器獲取的僅是最近一層的反向代理服務(wù)器 IP。為使 Nginx 后端的上游服務(wù)器可以獲得真實(shí)客戶端 IP,Nginx 提供了 ngx_http_realip_module 模塊用以實(shí)現(xiàn)真實(shí)客戶端

    2024年01月16日
    瀏覽(31)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包