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 boot項(xiàng)目快速構(gòu)建的全步驟
這篇文章主要給大家介紹了關(guān)于spring boot項(xiàng)目快速構(gòu)建的全步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
基于SpringBoot實(shí)現(xiàn)熱補(bǔ)丁加載器的詳細(xì)方案
每個(gè)程序員都有過(guò)這樣的經(jīng)歷——凌晨三點(diǎn)被電話驚醒,生產(chǎn)環(huán)境出現(xiàn)緊急bug,而修復(fù)發(fā)布又需要漫長(zhǎng)的流程,所以今天我們來(lái)介紹如何用SpringBoot?打造一個(gè)熱補(bǔ)丁加載器,需要的朋友可以參考下2025-09-09
解決java.lang.StringIndexOutOfBoundsException: String&nbs
這篇文章主要介紹了解決java.lang.StringIndexOutOfBoundsException: String index out of range: -1錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
Java并發(fā)編程中使用Executors類創(chuàng)建和管理線程的用法
這篇文章主要介紹了Java并發(fā)編程中使用Executors類創(chuàng)建和管理線程的用法,文中舉了用其啟動(dòng)線程和設(shè)置線程優(yōu)先級(jí)的例子,需要的朋友可以參考下2016-03-03
MyBatis參數(shù)處理實(shí)現(xiàn)方法匯總
這篇文章主要介紹了MyBatis參數(shù)處理實(shí)現(xiàn)方法匯總,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Java Map 在put值時(shí)value值不被覆蓋的解決辦法

