JAVAWEB根据前台请求获取用户IP

经典工具方法:

public static String getIpAddr(HttpServletRequest request) {

if (request == null) {

return "unknown";

}

String ip = request.getHeader("x-forwarded-for");

if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("Proxy-Client-IP");

}

if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("X-Forwarded-For");

}

if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("WL-Proxy-Client-IP");

}

if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("X-Real-IP");

}

if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {

ip = request.getRemoteAddr();

}

return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip);

}

说明:

这段代码的核心逻辑是"层层探测"。因为在复杂的网络环境(经过 CDN、Nginx、防火墙等)中,获取真实 IP 的方式不唯一,所以代码按优先级尝试从不同的 HTTP 头中获取。

无需前台代码特意在请求中添加什么数据,

无论直接访问还是经过代理访问两种情况,后台这段代码都可拿到用户IP:

  1. 直接访问(无 Nginx/CDN)

过程: 浏览器 \rightarrow Tomcat (Java 服务)

结果: 所有 getHeader(...) 都会是 null 。

最终 IP: 代码会执行到 request.getRemoteAddr() ,直接拿到来自浏览器的 IP。

  1. 代理访问(有 Nginx/CDN - 最常见的情况)

过程:

浏览器 \rightarrow Nginx

Nginx \rightarrow Tomcat (Java 服务)

关键点: Nginx 在转发请求给 Tomcat 时,会自动修改请求头。

Nginx 配置示例:

location / {

proxy_set_header X-Real-IP $remote_addr; # 把真实IP放入这个头

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 追加IP链

proxy_pass http://tomcat_server;

}

结果: Java 代码在 Tomcat 中运行时,就能从 X-Real-IP 或 X-Forwarded-For 头中读取到 Nginx 传过来的真实 IP。

相关推荐
日月云棠17 小时前
各版本JDK对比:JDK 25 特性详解
java
用户83071968408218 小时前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide18 小时前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
IT探险家18 小时前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺18 小时前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户9083246027319 小时前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端
桦说编程19 小时前
实战分析 ConcurrentHashMap.computeIfAbsent 的锁冲突问题
java·后端·性能优化
Rockbean20 小时前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
茶杯梦轩1 天前
CompletableFuture 在 项目实战 中 创建异步任务 的核心优势及使用场景
服务器·后端·面试
程序员清风1 天前
用了三年AI,我总结出高效使用AI的3个习惯!
java·后端·面试