欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用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è)問(wèn)題,所有的地址都顯示為 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)文章

  • idea普通javaweb項(xiàng)目如何部署到tomcat(讀取web.xml文件)

    idea普通javaweb項(xiàng)目如何部署到tomcat(讀取web.xml文件)

    這篇文章主要介紹了idea普通javaweb項(xiàng)目如何部署到tomcat(讀取web.xml文件),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java線程池復(fù)用線程的秘密你知道嗎

    Java線程池復(fù)用線程的秘密你知道嗎

    這篇文章主要為大家詳細(xì)介紹了Java線程池復(fù)用線程的秘密,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望您能夠多多關(guān)注

    2022-03-03
  • Java 8對(duì)LinkedHashSet元素進(jìn)行排序的操作方法

    Java 8對(duì)LinkedHashSet元素進(jìn)行排序的操作方法

    LinkedHashSet 是 Java 集合框架中的一個(gè)類,它繼承自 HashSet,并實(shí)現(xiàn)了 Set 接口,然而,LinkedHashSet 不支持元素的排序,它僅僅保持插入順序,所以本文給大家介紹了Java 8 如何對(duì) LinkedHashSet 元素進(jìn)行排序,需要的朋友可以參考下
    2024-11-11
  • Java設(shè)計(jì)模式之責(zé)任鏈模式詳解

    Java設(shè)計(jì)模式之責(zé)任鏈模式詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之責(zé)任鏈模式詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java的枚舉,注解和反射(一)

    Java的枚舉,注解和反射(一)

    今天小編就為大家分享一篇關(guān)于Java枚舉,注解與反射原理說(shuō)明,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2021-07-07
  • mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限項(xiàng)目實(shí)踐

    mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限項(xiàng)目實(shí)踐

    本文主要介紹了mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • java中的GC收集器詳情

    java中的GC收集器詳情

    這篇文章主要介紹了java中的GC收集器,GC(Garbage collection )指的是程序內(nèi)存管理分手動(dòng)和自動(dòng),手動(dòng)內(nèi)存管理,需要我們編程的時(shí)候顯式分配和釋放空間,但如果忘記釋放,會(huì)造成嚴(yán)重的內(nèi)存泄漏問(wèn)題,下面文章內(nèi)容我們就來(lái)實(shí)例說(shuō)明情況,需要的朋友可以參考一下
    2021-10-10
  • Flink DataStream基礎(chǔ)框架源碼分析

    Flink DataStream基礎(chǔ)框架源碼分析

    這篇文章主要為大家介紹了Flink DataStream基礎(chǔ)框架源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Java中的字節(jié)流文件讀取教程(一)

    Java中的字節(jié)流文件讀取教程(一)

    這篇文章主要給大家介紹了關(guān)于Java中字節(jié)流文件讀取的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • 解決運(yùn)行jar包出錯(cuò):ClassNotFoundException問(wèn)題

    解決運(yùn)行jar包出錯(cuò):ClassNotFoundException問(wèn)題

    這篇文章主要介紹了解決運(yùn)行jar包出錯(cuò):ClassNotFoundException問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論