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

Java如何獲取真實(shí)請(qǐng)求IP

 更新時(shí)間:2023年08月28日 17:02:01   作者:Ocean@上源碼  
這篇文章主要介紹了Java如何獲取真實(shí)請(qǐng)求IP問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java獲取真實(shí)請(qǐng)求IP

在使用Nginx或Apache等代理的情況下,需要Nginx或Apache代替客戶端去訪問(wèn)服務(wù)器。

當(dāng)請(qǐng)求包經(jīng)過(guò)反向代理后,在代理服務(wù)器這里這個(gè)IP數(shù)據(jù)包的IP包頭做了修改,最終后端WEB服務(wù)器得到的數(shù)據(jù)包的頭部源IP地址是代理服務(wù)器的IP地址。

這樣一來(lái),后端服務(wù)器的程序就無(wú)法獲取用戶的真實(shí)ip。

nginx中配置:

proxy_set_header Host  $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Apache有代理的情況:

vi /usr/local/apache/conf/httpd.conf
Include conf/extra/httpd-remoteip.conf
vi /usr/local/apache/conf/extra/httpd-remoteip.conf
LoadModule remoteip_module modules/mod_remoteip.so 
RemoteIPHeader X-Forwarded-For 
RemoteIPinternalProxy 127.0.0.1 
  • X-Real-IP 真實(shí)請(qǐng)求IP【Nginx中設(shè)置】
  • X-Forwarded-For IP鏈,真實(shí)IP + , + 代理IP1.... + , + 代理IPN
  • request.getRemoteAddr() 獲取真實(shí)IP/代理IP(用戶使用代理軟件時(shí)無(wú)法獲取真實(shí)IP)

真實(shí)請(qǐng)求IP

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class IPUtil {
    /**
     * 真是請(qǐng)求IP
     *
     * @param request
     * @return
     */
    public static String getRealRequestIp(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.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        if (null != ip && ip.contains(",")) {
            ip = ip.substring(0, ip.indexOf(","));
        }
        return ip;
    }
}

本機(jī)IP

???????import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class IPUtil {
    /**
     * 本機(jī)IP
     *
     * @return
     * @throws UnknownHostException
     */
    public static String getLocalIp() throws UnknownHostException {
        return InetAddress.getLocalHost().getHostAddress();
    }
}

java獲取發(fā)送請(qǐng)求的電腦的IP地址

客戶端所有的請(qǐng)求信息都可以通過(guò)HttpServletRequest獲得,獲取客戶端ip可以通過(guò)getRemoteAddr()獲取。

但是如果客戶端是通過(guò)代理訪問(wèn)我們的服務(wù)器,那么getRemoteAddr()獲取到的ip就很有可能不是真實(shí)的ip,這時(shí)候我們可以通過(guò)請(qǐng)求頭里的x-forwarded-for來(lái)獲取真實(shí)的ip,請(qǐng)求每經(jīng)一次代理,都會(huì)在后面拼接該代理的ip,以逗號(hào)分隔。

方法一

此方法獲取真實(shí)IP(本機(jī)IP并不是127.0.0.1)

獲取發(fā)送請(qǐng)求的電腦的IP地址,并返回

package com.lc.z.common.utils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import javax.servlet.http.HttpServletRequest;
public class IpUtil {
    /**
     * 獲取請(qǐng)求的ip
     */
    public static String getRequestIp() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        // 從獲取RequestAttributes中獲取HttpServletRequest的信息
        HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_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.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }
}

方法二

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
String clientIP = ServletUtil.getClientIP(request);
// 本地的服務(wù)輸出 IP:127.0.0.1
System.out.println("IP:"+ clientIP);

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring中的@Transactional注解使用詳解

    Spring中的@Transactional注解使用詳解

    這篇文章主要介紹了Spring中的@Transactional注解使用詳解,@Transactional 是一個(gè)注解,用于在 Spring 框架中管理事務(wù)的聲明式事務(wù)管理機(jī)制,它可以應(yīng)用于方法或類級(jí)別,并指示方法或類在執(zhí)行時(shí)應(yīng)該被包裝在一個(gè)事務(wù)中,需要的朋友可以參考下
    2024-01-01
  • Java解決程序包不存在的問(wèn)題解決

    Java解決程序包不存在的問(wèn)題解決

    在Java編程中,我們可以使用Maven或Gradle等構(gòu)建工具來(lái)管理依賴庫(kù),本文主要介紹了Java解決程序包不存在的問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解 一下
    2023-12-12
  • Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(共享模式)

    Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(共享模式)

    這篇文章主要為大家詳細(xì)介紹了Java并發(fā)系列之AbstractQueuedSynchronizer源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Idea如何導(dǎo)入java mysql驅(qū)動(dòng)包

    Idea如何導(dǎo)入java mysql驅(qū)動(dòng)包

    本文介紹了如何在IntelliJ IDEA中配置MySQL數(shù)據(jù)庫(kù)連接,首先下載MySQL Connector/J驅(qū)動(dòng)并解壓,然后在Idea項(xiàng)目中創(chuàng)建lib文件夾并將.jar文件復(fù)制到該文件夾,接著,將.jar文件添加為項(xiàng)目庫(kù),通過(guò)這些步驟,可以成功配置MySQL數(shù)據(jù)庫(kù)連接
    2024-12-12
  • Java?MyBatis是如何執(zhí)行一條SQL語(yǔ)句的

    Java?MyBatis是如何執(zhí)行一條SQL語(yǔ)句的

    這篇文章主要介紹了Java?MyBatis是如何執(zhí)行一條SQL語(yǔ)句的,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • springboot接口多實(shí)現(xiàn)類選擇性注入解決方案

    springboot接口多實(shí)現(xiàn)類選擇性注入解決方案

    這篇文章主要為大家介紹了springboot接口多實(shí)現(xiàn)類選擇性注入解決方案的四種方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • IDEA創(chuàng)建Maven項(xiàng)目后報(bào)錯(cuò)不出現(xiàn)src文件夾的情況解決

    IDEA創(chuàng)建Maven項(xiàng)目后報(bào)錯(cuò)不出現(xiàn)src文件夾的情況解決

    最近剛開(kāi)始學(xué)習(xí)maven,正準(zhǔn)備使用idea創(chuàng)建一個(gè)maven項(xiàng)目練手,卻發(fā)現(xiàn)自己創(chuàng)建的maven項(xiàng)目始終沒(méi)有src目錄,下面這篇文章主要給大家介紹了關(guān)于IDEA創(chuàng)建Maven項(xiàng)目后報(bào)錯(cuò)不出現(xiàn)src文件夾的情況解決,需要的朋友可以參考下
    2023-05-05
  • Java rmi遠(yuǎn)程方法調(diào)用基本用法解析

    Java rmi遠(yuǎn)程方法調(diào)用基本用法解析

    這篇文章主要介紹了Java rmi遠(yuǎn)程方法調(diào)用基本用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java并發(fā)讀寫(xiě)鎖ReentrantReadWriteLock 使用場(chǎng)景

    Java并發(fā)讀寫(xiě)鎖ReentrantReadWriteLock 使用場(chǎng)景

    ReentrantReadWriteLock是Java中一種高效的讀寫(xiě)鎖,適用于讀多寫(xiě)少的并發(fā)場(chǎng)景,它通過(guò)允許多個(gè)線程同時(shí)讀取,但在寫(xiě)入時(shí)限制為單線程訪問(wèn),從而提高了程序的并發(fā)性和性能,本文給大家介紹Java并發(fā)讀寫(xiě)鎖ReentrantReadWriteLock 使用場(chǎng)景,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • Java?IO篇之Reactor?網(wǎng)絡(luò)模型的概念

    Java?IO篇之Reactor?網(wǎng)絡(luò)模型的概念

    Reactor?模式也叫做反應(yīng)器設(shè)計(jì)模式,是一種為處理服務(wù)請(qǐng)求并發(fā)提交到一個(gè)或者多個(gè)服務(wù)處理器的事件設(shè)計(jì)模式,Reactor?模式主要由?Reactor?和處理器?Handler?這兩個(gè)核心部分組成,本文給大家介紹Java?IO篇之Reactor?網(wǎng)絡(luò)模型的概念,感興趣的朋友一起看看吧
    2022-01-01

最新評(píng)論

海口市| 施甸县| 马鞍山市| 合肥市| 南召县| 图们市| 阿鲁科尔沁旗| 象州县| 霞浦县| 北京市| 灵山县| 那曲县| 民权县| 江陵县| 简阳市| 民勤县| 大安市| 哈尔滨市| 平果县| 台东县| 雷山县| 陆良县| 桐城市| 金沙县| 五华县| 西峡县| 收藏| 黎平县| 龙山县| 抚松县| 霍城县| 忻城县| 新河县| 永登县| 三穗县| 鄱阳县| 福泉市| 五原县| 金湖县| 乐山市| 东港市|