SpringBoot獲取客戶端的IP地址的實(shí)現(xiàn)示例
前言
在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)題。
到此這篇關(guān)于SpringBoot獲取客戶端的IP地址的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot獲取客戶端IP地址內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring大白話之三級(jí)緩存如何解決循環(huán)依賴問(wèn)題
Spring通過(guò)三級(jí)緩存(singletonObjects、earlySingletonObjects、singletonFactories)解決單例循環(huán)依賴,三級(jí)緩存使用Lambda表達(dá)式提前暴露bean的早期引用,確保在遞歸調(diào)用時(shí)能夠正確獲取對(duì)象實(shí)例,避免死循環(huán)2025-02-02logback中顯示mybatis查詢?nèi)罩疚募?xiě)入的方法示例
這篇文章主要為大家介紹了logback中顯示mybatis查詢?nèi)罩疚募?xiě)入的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03Java Kafka分區(qū)發(fā)送及消費(fèi)實(shí)戰(zhàn)
本文主要介紹了Kafka分區(qū)發(fā)送及消費(fèi)實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07關(guān)于SpringSecurity配置403權(quán)限訪問(wèn)頁(yè)面的完整代碼
本文給大家分享SpringSecurity配置403權(quán)限訪問(wèn)頁(yè)面的完整代碼,配置之前和配置之后的詳細(xì)介紹,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-06-06java實(shí)現(xiàn)向有序數(shù)組中插入一個(gè)元素實(shí)例
本篇文章主要介紹了java實(shí)現(xiàn)向有序數(shù)組中插入一個(gè)元素實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Json讀寫(xiě)本地文件實(shí)現(xiàn)代碼
今天沒(méi)事研究了下Gson,寫(xiě)了個(gè)工具類(lèi),需要的朋友可以參考下2014-03-03