服务端获取远程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;
    }
}
相关推荐
斯普信专业组16 分钟前
IP隧道技术中数据包头部的变化分析:必然增加的封装机制
网络·tcp/ip·php
Ro小陌31 分钟前
C# TCP协议全面指南:从可靠传输到企业级高并发的深度实践
网络·tcp/ip·c#
我嘞个ddddd2 小时前
手写Tomcat(一)
java·服务器·tomcat
white.tie2 小时前
A服务器备份rabbitmq持久化目录到B服务器,不显示mq队列消息
运维·服务器·rabbitmq
北极光SD-WAN组网3 小时前
SD-WAN技术在远程光伏电站接入场景中的应用实践与深度解析
服务器·网络·数据库
三三十二3 小时前
什么是Linux
linux·运维·服务器
“初生”3 小时前
想免费使用 AWS 云服务器?注册、验证及开通全攻略
服务器·人工智能·aws
supingemail3 小时前
WebSocket 从入门到进阶实战
网络·websocket·网络协议
走过冬季4 小时前
TCP与UDP区别及应用场景详解
网络协议·tcp/ip·udp
互联网搬砖老肖4 小时前
运维打铁:生产服务器用户权限管理方案全解析
运维·服务器·网络