基于Spring MVC的客戶端真實IP獲取方案解析

文章目錄

  • 基于Spring MVC的客戶端真實IP獲取方案解析
    • 概述
    • 核心方法解析
      • 代碼實現
      • 工作流程
    • IP獲取優先級策略
    • IP有效性驗證
    • 異常處理與日志
    • 使用場景
    • 注意事項
    • 擴展建議

基于Spring MVC的客戶端真實IP獲取方案解析

概述

在Web應用開發中,準確獲取客戶端真實IP地址是常見的需求。本文介紹一個基于Spring MVC實現的客戶端IP獲取方案ClientIpController,該方案支持多種代理場景下的IP識別,并包含完善的校驗機制。

核心方法解析

代碼實現

/*** 獲取客戶端公網IP** @author xdr630*/
@RestController
public class ClientIpController {private static final Logger LOGGER = LoggerFactory.getLogger(KocaClientIpController.class);@GetMapping("/getRemoteIp")@ResponseBodypublic String getClientIp(HttpServletRequest request) {String clientIp = null;try {String xForwardedFor = request.getHeader("X-Forwarded-For");if (xForwardedFor != null && !xForwardedFor.isEmpty() && !"unknown".equalsIgnoreCase(xForwardedFor)) {// X-Forwarded-For:Squid 服務代理,X-Forwarded-For 可能包含多個 IP,取第一個非空的 IPclientIp = xForwardedFor.split(",")[0].trim();}if (clientIp == null || clientIp.isEmpty() || "unknown".equalsIgnoreCase(clientIp)) {// Proxy-Client-IP:apache 服務代理clientIp = request.getHeader("Proxy-Client-IP");}if (clientIp == null || clientIp.isEmpty() || "unknown".equalsIgnoreCase(clientIp)) {// WL-Proxy-Client-IP:weblogic 服務代理clientIp = request.getHeader("WL-Proxy-Client-IP");}if ((clientIp == null || clientIp.isEmpty() || "unknown".equalsIgnoreCase(clientIp))) {// X-Real-IP:nginx服務代理clientIp = request.getHeader("X-Real-IP");}if (clientIp == null || clientIp.isEmpty() || "unknown".equalsIgnoreCase(clientIp)) {clientIp = request.getRemoteAddr();}if (clientIp != null && !clientIp.isEmpty()) {clientIp = clientIp.split(",")[0];}if (!isValidIPv4(clientIp)) {LOGGER.warn("無效的客戶端 IP: {}", clientIp);// 在瀏覽器端顯示返回nullclientIp = "null";}} catch (Exception e) {LOGGER.error("獲取客戶端公網IP失敗", e);throw new RuntimeException(e);}return clientIp;}private boolean isValidIPv4(String ip) {String ipv4Regex = "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";return Pattern.compile(ipv4Regex).matcher(ip).matches();}
}

工作流程

  1. 多級代理支持:依次檢查以下請求頭

    • X-Forwarded-For:處理Squid等代理的逗號分隔IP
    • Proxy-Client-IP:Apache代理
    • WL-Proxy-Client-IP:WebLogic代理
    • X-Real-IP:Nginx代理
  2. 最終回退機制

clientIp = request.getRemoteAddr();
  1. 結果處理
    • 取首個有效IP段
    • IPv4格式校驗
    • 異常IP返回"null"字符串

IP獲取優先級策略

優先級Header名稱代理類型
1X-Forwarded-For通用代理/Squid
2Proxy-Client-IPApache
3WL-Proxy-Client-IPWebLogic
4X-Real-IPNginx
5getRemoteAddr()直接連接

IP有效性驗證

采用正則表達式校驗IPv4格式:

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

異常處理與日志

  • WARN級別日志:記錄無效IP格式
  • ERROR級別日志:捕獲處理異常
  • 異常轉換:將檢查異常轉為RuntimeException

使用場景

  1. 反向代理架構下的真實IP獲取
  2. 客戶端地理位置服務
  3. 訪問頻率控制
  4. 安全審計日志

注意事項

  1. 代理鏈中的首個IP可能不可信(需結合安全策略)
  2. 不支持IPv6地址(需擴展正則校驗)
  3. 生產環境建議添加速率限制
  4. 重要場景建議結合XFF白名單驗證

擴展建議

  1. 增加IPv6支持
  2. 添加可信代理IP列表驗證
  3. 集成緩存機制防止濫用
  4. 補充單元測試覆蓋邊界情況

該方案提供了可靠的客戶端IP獲取實現,開發人員應根據實際網絡架構調整header的檢查順序,并在安全敏感場景中補充額外的驗證邏輯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901663.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901663.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901663.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Idea集成AI:CodeGeeX開發

當入職新公司,或者調到新項目組進行開發時,需要快速熟悉項目代碼 而新的項目代碼,可能有很多模塊,很多的接口,很復雜的業務邏輯,更加有與之前自己的代碼風格不一致的現有復雜代碼 更別提很多人寫代碼不喜…

Python(18)Python中JSON的妙用:詳解序列化與反序列化原理及實戰案例

目錄 一、背景:為什么Python需要JSON?二、核心技術解析:序列化與反序列化2.1 核心概念2.2 類型映射對照表 三、Python操作JSON的四大核心方法3.1 基礎方法庫3.2 方法詳解1. json.dumps()2. json.loads()3. json.dump()4. json.load() 四、實戰…

【物聯網】基于LORA組網的遠程環境監測系統設計

基于LORA組網的遠程環境監測系統設計 演示視頻: 簡介: 1.本系統有一個主機,兩個從機。 2.一主多從的LORA組網通信,主機和兩個從機都配備了STM32F103單片機與 LoRa 模塊,主機作為中心設備及WIFI網關,負責接收和發送數據到遠程物聯網平臺和手機APP,兩個從機則負責采集數…

通過金融科技(Fintech)掌控財務:智能理財管理指南

李升偉 編譯 在當今世界,科技幾乎重塑了我們生活的方方面面,包括金錢的管理方式。金融科技(Fintech)讓個人財務管理變得前所未有的便捷、高效和智能。從追蹤支出到投資理財、提升信用評分,金融科技工具賦予個人掌控財…

html-css樣式

1. 所有類型為文本的 元素的樣式 指定所有類型為文本的 元素的樣式 /* 文本框的樣式 */ input[type"text"] { font-size: 25px;width: 80px; /* 文本框的寬度 */ padding: 25px; } font-size:字體大小 width:文本框寬度 padding&#…

【C語言基礎】C++ 中的 `vector` 及其 C 語言實現詳解

一、C 中的 vector:動態數組的核心特性 1. 基本概念 vector 是 C 標準模板庫(STL)中的動態數組容器,支持自動擴容、高效元素訪問和豐富的操作接口。其核心特性包括: 動態內存管理:自動調整容量&#xff0…

nvm切換node版本后,解決npm找不到的問題

解決方法如下 命令行查看node版本 node -v找到node版本所對應的npm版本 點擊進入node版本 npm對應版本下載 點擊進入npm版本 下載Windows 壓縮包 下載完成后,解壓,文件改名為npm 復制到你nvm對應版本的node_modules 下面 將下載的npm /bin 目錄…

數據結構:最小生成樹的普里姆算法和克魯斯卡爾算法

對于一個帶權(假設每條邊上的權均為大于零的實數)連通無向圖 G 中的不同生成樹,其每棵樹的所有邊上的權值之和也可能不同;圖的所有生成樹中具有邊上的權值之和最小的樹稱為圖的最小生成樹(Minimal Spanning Tree&#…

Information-Theoretic Limits of Bistatic Integrated Sensing and Communication

摘要 雙靜態感知指的是發射器(照亮目標)和感知接收器(估計目標狀態)在物理上分離的場景,這與發射和感知功能共存的單靜態感知形成對比。在實際場景中,雙靜態感知可能需要應對系統約束,或者作為…

XCTF-web(四)

unserialize3 需要反序列化一下:O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;} php_rce 題目提示rce漏洞,測試一下:?s/Index/\think\app/invokefunction&functioncall_user_func_array&vars[0]phpinfo&vars[1][]1 flag&#xff1…

Java Stream深度解析 高階技巧與性能優化實戰

文章目錄 一、Stream底層機制揭秘1.1 Stream流水線架構1.2 Spliterator探秘 二、自定義收集器高級實現2.1 實現高性能統計收集器2.2 多級分組優化技巧 三、并行流深度優化3.1 并行度控制策略3.2 工作竊取(Work-Stealing)優化 四、無限流與短路操作4.1 生成無限質數流4.2 短路操…

TailwindCss快速上手

什么是Tailwind Css? 一個實用優先的 CSS 框架,可以直接在標記中組合以構建任何設計。 開始使用Tailwind Css 如何安裝 下面是使用vite構建工具的方法 ①安裝 Tailwind CSS: tailwindcss通過tailwindcss/vitenpm安裝。 npm install tailwindcss tailwindcss…

Web前端 (CSS篇)

什么是CSS? css(Cascading Style Sheets)是層疊樣式表或級聯樣式表,是一組設置規則,用于控制web頁面外觀。 為什么使用CSS? CSS 用于定義網頁的樣式,包括針對不同設備和屏幕尺寸的設計和布局。 CSS 實例 body {background-col…

微服務2--服務治理與服務調用

前言 :本文主要闡述微服務架構中的服務治理,以及Nacos環境搭建、服務注冊、服務調用,負載均衡以及Feign實現服務調用。 服務治理 服務治理是微服務架構中最核心最基本的模塊。用于實現各個微服務的自動化注冊與發現。 服務注冊:在…

智能麻將出牌組件

開篇引言? 麻將作為一款風靡全球的策略性游戲,其復雜的規則和多變的牌局給玩家帶來了無盡樂趣。在數字化時代,運用編程技術為麻將游戲賦予智能,實現自動出牌功能,不僅能提升玩家體驗,還能深入探索算法在博弈游戲中的…

“大灣區珠寶藝境花園”璀璨綻放第五屆消博會

2025年4月13日,第五屆中國國際消費品博覽會(以下簡稱"消博會")重要主題活動——《大灣區珠寶藝境花園》啟動儀式在海南國際會展中心2號館隆重舉行。由廣東省金銀珠寶玉器業廠商會組織帶領粵港澳大灣區優秀珠寶品牌,以“…

基于前端技術的QR碼API開發實戰:從原理到部署

前言 QR碼(Quick Response Code)是一種二維碼,于1994年開發。它能快速存儲和識別數據,包含黑白方塊圖案,常用于掃描獲取信息。QR碼具有高容錯性和快速讀取的優點,廣泛應用于廣告、支付、物流等領域。通過掃…

利用耦合有限元和神經網絡計算的骨重塑模擬多尺度方法

Multiscale methodology for bone remodelling simulation using coupled finite element and neural network computation 摘要:本文旨在開發一種基于有限元分析(FEA)和神經網絡(NN)計算的多尺度分層混合模型&#xf…

使用異步特征引發的錯誤error[E0195]: lifetime parameters or bounds on method `before_save`

問題描述&#xff1a; 使用SeaOrm保存實體到數據庫時不想每次都設置更新時間&#xff0c;所以想通過實現ActiveModelBehavior在保存實體前統一設置更新時間 impl ActiveModelBehavior for ActiveModel {async fn before_save<C>(self, _db: &C, _insert: bool) -&…

TVS管與ESD保護二極管詳解:原理、區別與應用選型

一、TVS管&#xff08;瞬態電壓抑制二極管&#xff09; 1. 基本定義 TVS管&#xff08;Transient Voltage Suppressor&#xff09; 是一種用于抑制瞬態高壓脈沖的半導體器件&#xff0c;通過雪崩擊穿效應快速鉗位電壓&#xff0c;保護后端電路。 2. 核心特性參數 參數定義公…