服务端获取远程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;
    }
}
相关推荐
较劲男子汉4 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
wypywyp5 小时前
8. ubuntu 虚拟机 linux 服务器 TCP/IP 概念辨析
linux·服务器·ubuntu
Doro再努力5 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
senijusene5 小时前
Linux软件编程:IO编程,标准IO(1)
linux·运维·服务器
不像程序员的程序媛5 小时前
Nginx日志切分
服务器·前端·nginx
忧郁的橙子.5 小时前
02-本地部署Ollama、Python
linux·运维·服务器
chian-ocean5 小时前
深入 CANN:使用 `tbe-op` 构建自定义高性能算子
网络
醇氧5 小时前
【linux】查看发行版信息
linux·运维·服务器
中议视控6 小时前
可编程网络中央控制系统主机通过红外发射棒控制空调电视等红外设备
网络·物联网·5g
XiaoFan0126 小时前
免密批量抓取日志并集中输出
java·linux·服务器