springboot實(shí)現(xiàn)獲取客戶端IP地址的示例代碼
引言
在Web開發(fā)中,獲取客戶端的IP地址是一項(xiàng)常見需求,無論是用于日志記錄、安全策略實(shí)施還是個(gè)性化服務(wù)。在Spring Boot應(yīng)用程序中,有多種方法可以實(shí)現(xiàn)這一功能。本文將介紹在Spring Boot中如何獲取請求頭和客戶端IP地址的不同方法。
在Controller組件中
在Spring Boot的Controller組件中,可以通過自動注入HttpServletRequest對象來獲取客戶端的IP地址。
直接通過HttpServletRequest獲取
最直接的方法是使用HttpServletRequest對象的getRemoteAddr()方法來獲取IP地址。
@GetMapping
public String getIpAddress(HttpServletRequest request) {
String ip = request.getRemoteAddr();
return ip;
}這種方法是最簡單的,但是如果應(yīng)用部署在代理服務(wù)器,就無法獲取真實(shí)的客戶端IP。
使用X-Forwarded-For
如果應(yīng)用部署在代理服務(wù)器上,可以通過檢查X-Forwarded-For請求頭來獲取真實(shí)的客戶端IP地址。
@GetMapping
public String getIpAddress(HttpServletRequest request) {
String ipAddress = request.getHeader("X-Forwarded-For");
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
return ipAddress.split(",")[0];
}X-Forwarded-For頭可以包含一個(gè)或多個(gè)IP地址,第一個(gè)通常是客戶端的真實(shí)IP。
在非Controller組件中
在非Controller組件中,可以通過RequestContextHolder獲取當(dāng)前請求的HttpServletRequest對象。
使用RequestContextHolder
public String getIpAddress() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// 上面兩個(gè)獲取Ip的邏輯都可以
}這種方法可以在任何Spring管理的Bean中使用,提供了一種靈活的方式來獲取客戶端IP地址。
誤區(qū)
Spring Boot中的bean,那不是可以使用@Autowired 注解自動注入嗎?
直接使用 @Autowired 注解通常不能自動注入 HttpServletRequest 對象,因?yàn)?nbsp;HttpServletRequest 是與單個(gè) HTTP 請求關(guān)聯(lián)的,它的作用域是請求級別的,而不是整個(gè)應(yīng)用程序。
總結(jié)
本文介紹了在Spring Boot中獲取客戶端IP地址的幾種方法,包括在Controller中直接獲取、使用X-Forwarded-For頭、以及在非Controller組件中通過RequestContextHolder獲取。在實(shí)際應(yīng)用中,可能需要根據(jù)具體情況選擇最合適的方法。
到此這篇關(guān)于springboot實(shí)現(xiàn)獲取客戶端IP地址的示例代碼的文章就介紹到這了,更多相關(guān)springboot 獲取客戶端IP地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot Devtools實(shí)現(xiàn)項(xiàng)目熱部署的方法示例
這篇文章主要介紹了SpringBoot Devtools實(shí)現(xiàn)項(xiàng)目熱部署的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
最新IntelliJ?IDEA?2022配置?Tomcat?8.5?的詳細(xì)步驟演示
這篇文章主要介紹了IntelliJ?IDEA?2022?詳細(xì)配置?Tomcat?8.5?步驟演示,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
String在棧中,StringBuffer在堆中!所以String是不可變的,數(shù)據(jù)是共享的。StringBuffer都是獨(dú)占的,是可變的(因?yàn)槊看味际莿?chuàng)建新的對象?。?/div> 2015-11-11
深入解析Java的設(shè)計(jì)模式編程中單例模式的使用
這篇文章主要介紹了深入解析Java的設(shè)計(jì)模式編程中單例模式的使用,一般來說將單例模式分為餓漢式單例和懶漢式單例,需要的朋友可以參考下2016-02-02
SpringBoot如何讀取xml配置bean(@ImportResource)
這篇文章主要介紹了SpringBoot如何讀取xml配置bean(@ImportResource),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
mybatis如何獲取剛剛新插入數(shù)據(jù)的主鍵值id
這篇文章主要介紹了mybatis如何獲取剛剛新插入數(shù)據(jù)的主鍵值id問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Java矩陣連乘問題(動態(tài)規(guī)劃)算法實(shí)例分析
這篇文章主要介紹了Java矩陣連乘問題(動態(tài)規(guī)劃)算法,結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)矩陣連乘的算法原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-11-11
list集合去除重復(fù)對象的實(shí)現(xiàn)
下面小編就為大家?guī)硪黄猯ist集合去除重復(fù)對象的實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
SpringBoot Redis緩存數(shù)據(jù)實(shí)現(xiàn)解析
這篇文章主要介紹了SpringBoot Redis緩存數(shù)據(jù)實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01最新評論

