服务端获取远程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;
    }
}
相关推荐
程序员榴莲1 分钟前
网络编程入门 Python Socket 实现一个简单的用户认证系统
服务器·网络·python
ZStack开发者社区8 分钟前
全球化2.0 | ZStack亮相印尼云计算与数据中心大会 以新一代云底座助力数字印尼建设
服务器·云计算·gpu算力
甲方大人请饶命13 分钟前
Java-网络编程和反射
网络
DFT计算杂谈13 分钟前
VASP新手入门: IVDW 色散修正参数
linux·运维·服务器·python·算法
Oll Correct19 分钟前
实验二十五:从IPv4向IPv6过渡所使用的隧道技术
网络·笔记
programhelp_25 分钟前
Google 2026 New Grad SDE VO 三轮面试详解 | 含Behavioral、Coding、Design
java·服务器·数据库
c++逐梦人26 分钟前
五种IO模型与⾮阻塞IO
开发语言·网络
冰冰的米咖27 分钟前
交换与路由技术整理与总结(持续更新版)
网络·网络协议·智能路由器
樱桃花下的小猫30 分钟前
腐蚀Rust-服务器插件模组教程
服务器·新手友好·云鸢互联·零门槛一键开服·腐蚀rust
Sagittarius_A*30 分钟前
H3CSE 高性能园区网:Smart Link 与 Monitor Link 技术详解
网络·计算机网络·h3cse