SpringBoot如何獲取客戶端的IP地址
前言
在Web應(yīng)用程序中,獲取客戶端的IP地址是一項(xiàng)非常常見(jiàn)的需求,例如記錄訪問(wèn)日志、過(guò)濾惡意IP等。
在本文中,我們將介紹如何使用Spring Boot框架獲取客戶端的IP地址。
方法一
使用ServletRequest對(duì)象獲取IP地址
Spring Boot應(yīng)用程序可以使用HttpServletRequest對(duì)象獲取客戶端的IP地址。
在Spring Boot中,可以通過(guò)注入HttpServletRequest作為一個(gè)參數(shù)來(lái)獲取該對(duì)象。
@GetMapping("/getIp")
public String getIp(HttpServletRequest request) {
String ipAddress = request.getRemoteAddr();
return "Client IP address: " + ipAddress;
}
上述代碼中,我們通過(guò)調(diào)用 request.getRemoteAddr() 方法獲取客戶端的IP地址。
方法二
使用ServletRequestAttributes對(duì)象獲取IP地址
除了使用HttpServletRequest對(duì)象外,Spring Boot還提供了另一種獲取客戶端IP地址的方法。
這種方法是使用ServletRequestAttributes對(duì)象,在方法中注入該對(duì)象即可。
代碼如下:
@GetMapping("/getIp2")
public String getIp2(ServletRequest request) {
String ipAddress = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest().getRemoteAddr();
return "Client IP address: " + ipAddress;
}
在上面的代碼中,我們通過(guò) RequestContextHolder.currentRequestAttributes()方法獲取當(dāng)前的HttpServletRequest對(duì)象
再通過(guò) getRequest().getRemoteAddr() 方法獲取客戶端的IP地址。
注意事項(xiàng)
雖然以上兩種方法可以獲取客戶端的IP地址,但需要注意以下幾個(gè)問(wèn)題:
- 如果應(yīng)用程序部署在反向代理服務(wù)器后面,使用上述方法獲取的IP地址可能是反向代理服務(wù)器的IP地址,而不是客戶端真正的IP地址。
- 有些客戶端可能使用了匿名代理服務(wù)器,例如TOR等,此時(shí)獲取到的IP地址不是客戶端真正的IP地址。
解決方案
使用X-Forwarded-For頭
為了解決上述問(wèn)題,我們可以使用X-Forwarded-For頭。
該頭字段是一個(gè)逗號(hào)分隔的IP地址列表,最左邊的IP地址是客戶端的真實(shí)IP地址。
以下是使用X-Forwarded-For頭獲取客戶端IP地址的示例代碼。
@GetMapping("/getIp3")
public String getIp3(HttpServletRequest request) {
String ipAddress = request.getHeader("X-Forwarded-For");
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
return "Client IP address: " + ipAddress.split(",")[0];
}
上述代碼中,我們首先使用 request.getHeader("X-Forwarded-For") 方法獲取X-Forwarded-For頭字段的值,如果獲取失敗,則嘗試使用其他頭字段。
最后,我們通過(guò)逗號(hào)對(duì)IP地址進(jìn)行分割,獲取最左邊的IP地址,即客戶端的真實(shí)IP地址。
總結(jié)
本文介紹了使用Spring Boot框架獲取客戶端IP地址的三種方法:
- 1.使用HttpServletRequest對(duì)象
- 2.使用ServletRequestAttributes對(duì)象
- 3.使用X-Forwarded-For頭
當(dāng)我們需要獲取客戶端的真實(shí)IP地址時(shí),應(yīng)該使用X-Forwarded-For頭解決代理服務(wù)器和匿名代理服務(wù)器的問(wèn)題。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot啟動(dòng)時(shí)自動(dòng)執(zhí)行特定代碼的完整指南
Spring?Boot?提供了多種靈活的方式在應(yīng)用啟動(dòng)時(shí)執(zhí)行初始化代碼,以下是所有可行方法的詳細(xì)說(shuō)明和最佳實(shí)踐,大家可以根據(jù)自己的需求進(jìn)行選擇2025-04-04
關(guān)于springboot-starter-undertow和tomcat的區(qū)別說(shuō)明
這篇文章主要介紹了關(guān)于springboot-starter-undertow和tomcat的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java7之forkjoin簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Java7引入了Fork Join的概念,來(lái)更好的支持并行運(yùn)算。接下來(lái)通過(guò)本文給大家分享Java7之forkjoin簡(jiǎn)介,感興趣的朋友一起看看吧2017-06-06
從入門到實(shí)戰(zhàn)詳解如何使用Apache?POI操作Word文檔
Apache?POI是Java生態(tài)中最流行的Microsoft?Office文檔操作庫(kù)之一,它為Word文檔提供了全面的API支持,下面我們來(lái)看看如何使用Apache?POI進(jìn)行word文檔的操作吧2025-06-06
JavaWeb實(shí)現(xiàn)裁剪圖片上傳完整代碼
這篇文章主要為大家詳細(xì)介紹了javaWeb實(shí)現(xiàn)裁剪圖片上傳完整代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Java使用Hutool執(zhí)行日期的加法和減法操作方法
使用Hutool進(jìn)行日期的加法和減法操作,可以使用`DateUtil.offsetXXX()`方法來(lái)實(shí)現(xiàn),這些方法會(huì)返回一個(gè)新的日期,而不是在原日期上進(jìn)行修改,本文給大家介紹Java使用Hutool執(zhí)行日期的加法和減法操作方法,感興趣的朋友一起看看吧2023-11-11
深入解析Spring Boot熱部署與性能優(yōu)化實(shí)踐指南
本文從Spring Boot熱部署原理入手,結(jié)合生產(chǎn)環(huán)境中的實(shí)戰(zhàn)經(jīng)驗(yàn),深入分析熱部署的底層實(shí)現(xiàn)機(jī)制,并給出性能優(yōu)化的實(shí)踐建議,幫助開(kāi)發(fā)者在提升開(kāi)發(fā)效率的同時(shí)保障系統(tǒng)性能,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-10-10
SpringBoot松散綁定/寬松綁定(Relaxed Binding)的實(shí)現(xiàn)
本文主要介紹了SpringBoot松散綁定/寬松綁定(Relaxed Binding)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08

