服务端获取远程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;
    }
}
相关推荐
TheBestRucy几秒前
基于Dify的旅游攻略&王者荣耀攻略智能助手项目
服务器·开发语言·人工智能·python·算法·旅游
zfoo-framework13 分钟前
安装pi agent 支持duojie和deepseek
java·服务器·前端
梅菲塔亚22 分钟前
Keepalived高可用全解析
linux·运维·服务器·开发语言·网络·php
15Moonlight1 小时前
Linux系统(02):基础开发工具
linux·运维·服务器
hxhy001 小时前
服务器挖矿排查与清理
运维·服务器
basketball6161 小时前
软考中级网络工程师 第6章 网络安全 备考总结
大数据·网络·web安全·网络工程师·软考
lightqjx1 小时前
VS Code连接Linux远端服务器的方法
linux·服务器·vs code
琥珀色糖2 小时前
Linux GDB调试
linux·运维·服务器·gdb·调试
NGINX开源社区2 小时前
NGINX Ingress Controller 5.5:安全性与性能提升,迁移更轻松
java·服务器·nginx
云老大-阿里云国际站代理商2 小时前
腾讯云国际站代理商:CVM 跨地域网络抖动排查,深度分析 TCP 重传与 MTU 问题
网络·tcp/ip·腾讯云