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。

相关推荐
离陌在学C#11 小时前
C# 重载与重写:深入理解面向对象编程的核心概念
java·c#
洛阳泰山11 小时前
AI 应用层被 Python 卷成红海,为什么我偏要用 Java 造一个 RAG + 工作流引擎?
java·人工智能·后端
二十雨辰11 小时前
[Java]-Spring面试题
java·开发语言
扬帆破浪11 小时前
文档自动检查:用 Claude Code、OpenClaw 审 WPS 文件:预览、批注、改正文
运维·服务器·wps
老马历写记11 小时前
Maven POM 依赖管理总结
java·maven·system·pom·optional
古法安卓11 小时前
Android-车机 GNSS 定位数据接收问题排查
android·java·android studio
蔬菜_12 小时前
前端转全栈-day5(数组、list、set)
java·前端·数据结构·list
萧瑟余晖12 小时前
Java深入解析篇二十二之虚拟线程
java·开发语言
OuO-212 小时前
笔试强训 Day 34:ISBN 号码、kotori 和迷宫、矩阵最长递增路径
java·算法·矩阵
zt1985q12 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源