最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Java實(shí)現(xiàn)獲取客戶端IP地址

 更新時(shí)間:2025年02月09日 09:37:37   作者:子非衣  
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)獲取客戶端IP地址,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

首先是獲取 IP,直接上代碼

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * 獲取IP地址工具類
 */
public final class IpUtil {

    private static final String UNKNOWN = "unknown";
    private static final String IPV6_LOCAL = "::1";  // 推薦用壓縮形式

    private IpUtil(){
        throw new AssertionError();
    }

    /**
     * 獲取請(qǐng)求用戶的IP地址
     * @return
     */
    public static String getRequestIp() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        return getRequestIp(request);
    }

    /**
     * 獲取請(qǐng)求用戶的IP地址
     * @param request
     * @return
     */
    public static String getRequestIp(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");

        // 處理多級(jí)代理,獲取第一個(gè)非 unknown 的有效 IP
        if (ip != null && !ip.isEmpty() && !UNKNOWN.equalsIgnoreCase(ip)) {
            ip = ip.split(",")[0].trim();  // 取第一個(gè) IP
        } else {
            ip = request.getHeader("X-Real-IP");  // 常見于 Nginx 代理
        }

        // 備用方案:嘗試從其他頭部獲取
        if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();  // 默認(rèn)獲取遠(yuǎn)程地址
        }

        // 如果是本地回環(huán)地址,則返回本地機(jī)器的 IP
        if (IPV6_LOCAL.equals(ip) || "127.0.0.1".equals(ip)) {
            ip = getLocalhostIp();  // 獲取本地 IP
        }

        return ip;
    }

    private static String getLocalhostIp() {
        try {
            InetAddress inetAddress = InetAddress.getLocalHost();
            return inetAddress.getHostAddress();
        } catch (UnknownHostException e) {
            e.printStackTrace();
            return "127.0.0.1";  // 如果無(wú)法獲取,則返回回環(huán)地址
        }
    }

}

但是今天發(fā)現(xiàn)一個(gè)問題,所有的地址都顯示為 127.0.0.1,我一琢磨應(yīng)該是 nginx 代理導(dǎo)致的,所以給 nginx 加上下面的配置

server {
    listen 80;
    server_name your-domain.com;

    location / {
        # 轉(zhuǎn)發(fā)客戶端的真實(shí) IP
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;

        # 代理轉(zhuǎn)發(fā)請(qǐng)求到網(wǎng)關(guān)服務(wù)
        proxy_pass http://localhost:1000/;
    }
}

重啟 nginx 后再次請(qǐng)求就拿到了真實(shí)的 IP 地址了(注意所謂的真實(shí) IP 不一定真實(shí),這個(gè)東西是可以偽造的,至于防范措施大家自己去搜,道高一尺魔高一丈)

到此這篇關(guān)于使用Java實(shí)現(xiàn)獲取客戶端IP地址的文章就介紹到這了,更多相關(guān)Java獲取客戶端IP地址內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • maven解決依賴沖突的三種解決方法

    maven解決依賴沖突的三種解決方法

    依賴沖突是指項(xiàng)目依賴的某一個(gè)jar包,有多個(gè)不同的版本,因而造成了包版本沖突,本文主要介紹了maven解決依賴沖突的三種解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Java處理表格的實(shí)用工具庫(kù)

    Java處理表格的實(shí)用工具庫(kù)

    EasyExcel是一個(gè)基于Java的簡(jiǎn)單、省內(nèi)存的讀寫Excel的開源項(xiàng)目,在盡可能節(jié)約內(nèi)存的情況下支持讀寫百M(fèi)的Excel,下面這篇文章主要給大家分享介紹了一個(gè)關(guān)于Java處理表格的實(shí)用工具庫(kù),需要的朋友可以參考下
    2021-11-11
  • java string的一些細(xì)節(jié)剖析

    java string的一些細(xì)節(jié)剖析

    首先說(shuō)明這里指的是Java中String的一些細(xì)節(jié)部分,需要的朋友可以參考
    2012-11-11
  • Java 詳解包裝類Integer與int有哪些共通和不同

    Java 詳解包裝類Integer與int有哪些共通和不同

    這篇文章主要介紹的是 Java中int和Integer的區(qū)別,Java 是一種強(qiáng)數(shù)據(jù)類型的語(yǔ)言,因此所有的屬性必須有一個(gè)數(shù)據(jù)類型,下面文章基于Java詳細(xì)int和Integer有何區(qū)別,需要的朋友可以參考一下
    2022-04-04
  • springboot mybatis里localdatetime序列化問題的解決

    springboot mybatis里localdatetime序列化問題的解決

    這篇文章主要介紹了springboot mybatis里localdatetime序列化問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-10-10
  • Java之dao模式詳解及代碼示例

    Java之dao模式詳解及代碼示例

    這篇文章主要介紹了Java之dao模式詳解及代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Maven介紹與配置+IDEA集成Maven+使用Maven命令小結(jié)

    Maven介紹與配置+IDEA集成Maven+使用Maven命令小結(jié)

    Maven是Apache軟件基金會(huì)的一個(gè)開源項(xiàng)目,是一個(gè)優(yōu)秀的項(xiàng)目構(gòu)建管理工具,它用來(lái)幫助開發(fā)者管理項(xiàng)目中的 jar,以及 jar 之間的依賴關(guān)系、完成項(xiàng)目的編譯、測(cè)試、打包和發(fā)布等工作,本文給大家介紹Maven介紹與配置+IDEA集成Maven+使用Maven命令,感興趣的朋友一起看看吧
    2024-01-01
  • Spring?Boot讀取配置文件內(nèi)容的3種方式(@Value、Environment和@ConfigurationProperties)

    Spring?Boot讀取配置文件內(nèi)容的3種方式(@Value、Environment和@ConfigurationP

    工作中經(jīng)常會(huì)有一些參數(shù)需要配置,同時(shí)在代碼里面需要用到,所有就需要配置類讀取,然后在使用的時(shí)候注入該類進(jìn)行獲取相關(guān)參數(shù),下面這篇文章主要給大家介紹了關(guān)于Spring?Boot讀取配置文件內(nèi)容的3種方式,需要的朋友可以參考下
    2023-01-01
  • Java讀取txt文件中的數(shù)據(jù)賦給String變量方法

    Java讀取txt文件中的數(shù)據(jù)賦給String變量方法

    今天小編就為大家分享一篇Java讀取txt文件中的數(shù)據(jù)賦給String變量方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-07-07
  • Java代碼實(shí)現(xiàn)酒店管理系統(tǒng)

    Java代碼實(shí)現(xiàn)酒店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java代碼實(shí)現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論

扎兰屯市| 荥经县| 新丰县| 东莞市| 夹江县| 卓尼县| 梨树县| 隆德县| 通州区| 石林| 吕梁市| 孟连| 蓝田县| 醴陵市| 得荣县| 栾川县| 中山市| 平定县| 仁化县| 棋牌| 揭阳市| 阿尔山市| 郸城县| 淮北市| 荔波县| 唐海县| 行唐县| 镇康县| 徐水县| 安多县| 枣庄市| 雅安市| 洛隆县| 阿克苏市| 合川市| 吐鲁番市| 汕尾市| 米林县| 常山县| 湖南省| 怀安县|