Java菜鸟在IP问题踩坑了

之前有做过获取客户端公网IP的项目

一般都是 正常的request.getRemoteAddr 或者request.getRemoteHost 可获取到客户端的公网IP,

或者项目部署在有nginx代理的环境下,我们要从头信息获取相应的IP,如果是多个我们需要取第一个IP

但是正常非代理部署的情况下,也出现了类似的情况,电脑访问正常获取,同一个网络下手机访问获取的是其他地方的公网IP

原来这个也需要处理代理的问题

总的概括来说获取IP的时候需要考虑的一下几点:

1、nginx等代理的IP

2、K8s中的IP

3、使用代理的情况

具体代码如下:

{
String ip = null;
try {
//以下两个获取在k8s中,将真实的客户端IP,放到了x-Original-Forwarded-For。而将WAF的回源地址放到了 x-Forwarded-For了。
ip = request.getHeader("X-Original-Forwarded-For");
if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Forwarded-For");
}
//获取nginx等代理的ip
if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("x-forwarded-for");
}
if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
//兼容k8s集群获取ip
if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
if (LOCALHOST_IP1.equalsIgnoreCase(ip) || LOCALHOST_IP.equalsIgnoreCase(ip)) {
//根据网卡取本机配置的IP
InetAddress iNet = null;
try {
iNet = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
log.error("getClientIp error: {}", e);
}
ip = iNet.getHostAddress();
}
}
} catch (Exception e) {
log.error("IPUtils ERROR ", e);
}
//使用代理,则获取第一个IP地址
if (!StringUtils.isEmpty(ip) && ip.indexOf(IP_UTILS_FLAG) > 0) {
ip = ip.substring(0, ip.indexOf(IP_UTILS_FLAG));
}

return ip;
}

Java菜鸟在IP问题踩坑了的相关教程结束。

相关推荐:

GraalVM 中 Java Map 与 Python 的双向互操作实践

本文详解如何在GraalVMPolyglot环境中安全、高效地将JavaMap传递给Python脚本,调用其方法获取值,并将处理结果(如新Map)返回Java,重点解决AttributeError:foreignobjecthasnoattribute'items'等常见互操作异常。 本文详解如何在...

Python IP + User-Agent + 指纹的复合限流

requests被秒封因服务端综合检测tcp指纹、ip行为和浏览器指纹;纯python默认tls特征固定、缺sec-ch-ua等头、无时序抖动,易被cdn/waf拦截。 为什么requests直接加headers还是被秒封? 因为服务端不只看User-Agent,它同时采集TCP指纹(TLS握手特征...

PySpark Java Gateway Exited 错误的根源与解决方案

本文详解pyspark报错`[java_gateway_exited]javagatewayprocessexitedbeforesendingitsportnumber`的根本原因——虚拟环境(venv)隔离导致`java_home`和系统级java路径未被正确继承,并提供可落地的修复步骤与最佳实...

fastapi 如何实现简单的基于 IP 的频率限制

FastAPI需借助依赖项与缓存实现IP限流:简易版用内存字典记录IP时间戳并清理过期项;增强版加asyncio.Lock防并发冲突;生产环境应换为Redis的sortedset,配合可信IP校验确保安全。 FastAPI本身不内置IP频率限制功能,但可通过中间件或依赖项+缓存(如内存缓存或Redi...

python与java用途区别有哪些

Python适合快速开发、数据科学、AI建模、轻量Web服务及自动化脚本;Java适合大型企业系统、Android开发、高并发中间件及需长期稳定维护的场景。 Python和Java虽然都能做通用开发,但实际用起来分工很明确——不是“哪个更好”,而是“谁更合适”。关键看你要解决什么问题、在什么环境里跑...

Python配置文件加载_ini与json解析【教程】

应根据实际需求选择:ini适合分节、带注释的简单配置(如数据库连接),用configparser读取;json适合嵌套复杂、跨语言共享的配置(如API参数),用json模块加载。 Python读取配置文件,ini和json是最常用的两种格式。选哪种不取决于“哪个更好”,而要看实际需求:ini更适合分...