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。

相关推荐
Flynn Liang5 小时前
让 AI 查订单、查库存、发消息:Spring AI 自定义工具(Tool)实战与工具描述工程
java·人工智能·spring·函数调用·springai·tool·自定义工具
Rain的Java大神之路5 小时前
我,13年Java老兵,建了个免费网站,公开叫板“Java已死”:没有广告,没有付费墙,151个页面全是踩坑干货
java·后端·程序员
雪落漂泊5 小时前
Linux进程(三)概念:进程优先级与进程切换篇
linux·运维·服务器
拂拉氏5 小时前
【知识讲解】 Linux信号与可重入函数的认识
linux·运维·服务器
萧瑟余晖6 小时前
Spring Integration企业集成概览详解
java·后端·spring
pikapika~~~6 小时前
计算机网络八股
服务器·网络·计算机网络
这个昵称不容易6 小时前
SpringBoot 墙绘交易平台毕设:128个文件154个接口含论文,带运行截图
java·springboot·毕设
SimonKing6 小时前
告别纸质合同,使用DocuSeal搭建私有电子签平台
java·后端·程序员
djjjx.6 小时前
Linux进程篇(十二):从零构建属于你的自定义 Shell 解释器
linux·运维·服务器
七夜zippoe6 小时前
Spring AI 函数调用:让 Java 方法变成 Agent 的工具(实战全流程)
java·人工智能·spring·ai·agent·函数调用