聊一下java获取客户的ip

有一个很基础的功能,就是需要在后端记录用户请求的ip,一般来说,项目都会使用nginx负载,需要在nginx配置中加入一些功能

java 复制代码
location /xxx{
        proxy_pass http://gateway;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        add_header Access-Control-Allow-Methods *;
        add_header Access-Control-Max-Age 3600000;
        add_header Access-Control-Allow-Credentials true;
        add_header Access-Control-Allow-Origin $http_origin;
        add_header Access-Control-Allow-Headers $http_access_control_request_headers;
        if ($request_method = OPTIONS ) {
             return 200;
        }
    }

这个简单来说就是在请求头里加入X-Real-IP参数等等

然后我们的后端代码可以这样去获取

java 复制代码
import javax.servlet.http.HttpServletRequest;

public String getClientIp(HttpServletRequest request) {
    String ip = request.getHeader("X-Forwarded-For"); // 常见代理服务器传递的 IP 头
    
    if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("Proxy-Client-IP"); // Apache 代理
    }
    if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("WL-Proxy-Client-IP"); // WebLogic 代理
    }
    if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("HTTP_CLIENT_IP"); // 一些旧代理
    }
    if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("HTTP_X_FORWARDED_FOR"); // 另一种代理头
    }
    if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getRemoteAddr(); // 直接获取远程地址(可能是代理 IP)
    }
    
    // 处理多个 IP 的情况(X-Forwarded-For 可能包含多个 IP,如 "client, proxy1, proxy2")
    if (ip != null && ip.contains(",")) {
        ip = ip.split(",")[0].trim();
    }
    
    return ip;
}

最后的最后,如果项目没有使用nginx负载,这段java代码也可以直接使用,但是是k8s那你就得自己找其他方案 了。。

相关推荐
毕业设计70327 分钟前
(免费领源码)SSM董家湾线上点餐系统04682- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·redis·mysql·tomcat·maven·mybatis·ssm
Q26433650231 小时前
【有源码】基于SpringBoot+Vue的居民健康体检与慢病干预管理系统-面向智慧医疗的体检预约与健康知识服务平台
java·vue.js·spring boot·mysql·毕业设计·javaweb·课程设计
悠仁さん1 小时前
非类型模板参数的特化与偏特化
java·数据结构·算法
鬼手点金1 小时前
上下文:Agent 的眼睛
java·前端·人工智能·git·深度学习
171320330计算机毕设编程2 小时前
计算机毕业设计 基于Hadoop的新能源汽车发展前景分析 LW PPT
java·大数据·hadoop·python·算法·随机森林·线性回归
技术小结-李爽2 小时前
【工具】怎么在终端中启动springboot项目?
java·spring boot·后端·maven
Shaoshing2 小时前
消息发送
java·开发语言
Code_Solitude2 小时前
c语言:指针(3)+冒泡排序
java·c语言·算法
乌暮2 小时前
从 `println` 到生产级日志:Spring Boot 日志体系完全指南
java·开发语言·jvm·spring boot·后端·学习·面试