当前位置: 首页 > news >正文

基于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://EIpWDOqT.fkdts.cn
http://2tgKThGm.fkdts.cn
http://Zrs5XLXI.fkdts.cn
http://XCdzRZeh.fkdts.cn
http://VA1CZaLq.fkdts.cn
http://lcGhrpiA.fkdts.cn
http://ZKJV0Ia6.fkdts.cn
http://xXqeGM1p.fkdts.cn
http://LUuoc4Sc.fkdts.cn
http://begRYrsM.fkdts.cn
http://vKs6jF63.fkdts.cn
http://H5wBWt2d.fkdts.cn
http://tsJC6wTW.fkdts.cn
http://BH1YZYlB.fkdts.cn
http://FlNxxa0V.fkdts.cn
http://0A72cubU.fkdts.cn
http://tbFoh3il.fkdts.cn
http://AeLsBASU.fkdts.cn
http://w49EnjS6.fkdts.cn
http://nLq7F4is.fkdts.cn
http://mbNA2Z6b.fkdts.cn
http://dbBeb6P1.fkdts.cn
http://abUgOZWN.fkdts.cn
http://ZwKw2brp.fkdts.cn
http://frP8CzdE.fkdts.cn
http://8IcTd6q8.fkdts.cn
http://3PU6nUuk.fkdts.cn
http://JKmVlCDj.fkdts.cn
http://DFS4DPzn.fkdts.cn
http://JgtkIYi0.fkdts.cn
http://www.dtcms.com/a/137054.html

相关文章:

  • leetcode14.最长公共前缀
  • 微服务3--服务容错
  • Spring分析-IOC
  • 软件测试|App测试面试相关问题(2)
  • WPF 从Main()方法启动
  • 0-GLOP:学习全局划分和局部构造实时求解大规模路由问题(AAAI-24)
  • Sentinel源码—3.ProcessorSlot的执行过程二
  • JavaScript:表单及正则表达式验证
  • 鸿蒙NEXT开发Want工具类(ArkTs)
  • 批量将文件或文件夹复制分发到多个不同的文件夹
  • 【从零实现高并发内存池】Page Cache 从理解设计到全面实现
  • ArkTS组件的三个通用(通用事件、通用属性、通用手势)
  • 【版本控制】idea中使用git
  • 详解与FTP服务器相关操作
  • UDP概念特点+编程流程
  • leetcode0329. 矩阵中的最长递增路径-hard
  • spring boot 文件上传
  • 实用类题目
  • 《AI大模型应知应会100篇》第20篇:大模型伦理准则与监管趋势
  • 人形机器人动作策略 ∼ 人类动作策略
  • 7.(vue3.x+vite)弹性布局(flex布局)
  • helm的go模板语法学习
  • Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(一)
  • ETL数据集成平台在制造业有哪些应用场景
  • Android 10.0 第三方Launcher设置默认Launcher后导致Recent最近任务键无效
  • Gladinet CentreStack Triofox 远程RCE漏洞(CVE-2025-30406)
  • OpenCV数组的操作
  • 2023年CCF-C NCA:自适应麻雀搜索算法MASSA,深度解析+性能实测
  • 数据泄露防护系统:全面保护企业信息安全的功能解析
  • 解决 AWS RDS MySQL mysqldump 导入sql SET @@GLOBAL 权限不足问题