服务端获取远程ip的方法

在业务系统中,通常需要获取用户的真实ip地址对用户进行分析,nginx配置需要有相关的配置才行

1、nginx配置
#server模块配置
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;
2、后端代码获取ip地址
public class IPUtils {
    public static final String UNKNOW_IP = "unknown";

    /**
     * 获取IP地址
     *
     * @param request 请求
     * @return request发起客户端的IP地址
     */
    public static String getIP(HttpServletRequest request) {
        if (request == null)  return "0.0.0.0";
        String xip = request.getHeader("X-Real-IP");
        String xfor = request.getHeader("X-Forwarded-For");

        if (StrUtil.isNotEmpty(xfor) && !UNKNOW_IP.equalsIgnoreCase(xfor)) {
            //多次反向代理后会有多个ip值,第一个ip才是真实ip
            int index = xfor.indexOf(",");
            if (index != -1) {
                return xfor.substring(0, index);
            } else {
                return xfor;
            }
        }

        xfor = xip;
        if (StrUtil.isNotEmpty(xfor) && !UNKNOW_IP.equalsIgnoreCase(xfor)) {
            return xfor;
        }

        if (StrUtil.isBlank(xfor) || UNKNOW_IP.equalsIgnoreCase(xfor)) {
            xfor = request.getHeader("Proxy-Client-IP");
        }
        if (StrUtil.isBlank(xfor) || UNKNOW_IP.equalsIgnoreCase(xfor)) {
            xfor = request.getHeader("WL-Proxy-Client-IP");
        }
        if (StrUtil.isBlank(xfor) || UNKNOW_IP.equalsIgnoreCase(xfor)) {
            xfor = request.getHeader("HTTP_CLIENT_IP");
        }
        if (StrUtil.isBlank(xfor) || UNKNOW_IP.equalsIgnoreCase(xfor)) {
            xfor = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (StrUtil.isBlank(xfor) || UNKNOW_IP.equalsIgnoreCase(xfor)) {
            xfor = request.getRemoteAddr();
        }
        return xfor;
    }
}
相关推荐
boy快快长大25 分钟前
Linux: 已占用接口
linux·运维·服务器
网硕互联的小客服40 分钟前
服务器硬件老化导致性能下降的排查与优化
linux·运维·服务器·安全·centos
tianmu_sama1 小时前
[Linux高性能服务器编程] 多线程编程
linux·服务器·c++·算法
北京耐用通信2 小时前
半导体晶圆精控:ethercat转profient网关数据提升制造精度
网络·制造·ethercat·ethercat总线
Ljw...2 小时前
HTTP
linux·网络·网络协议·http
小杨小杨12 小时前
RIP-AV:使用上下文感知网络进行视网膜动脉/静脉分割的联合代表性实例预训练
网络
追风赶月、2 小时前
【网络】HTTPS协议原理
网络·网络协议·https
网安CILLE3 小时前
自学网络安全(黑客技术)2025年 —90天学习计划
linux·网络·安全·web安全·网络安全
程序员JerrySUN3 小时前
从底层驱动到 OpenCV:深入解析 Linux 摄像头完整技术栈
linux·服务器·开发语言·人工智能·opencv·计算机视觉