服务端获取远程ip的方法

news/2025/2/26 22:53:29

在业务系统中,通常需要获取用户的真实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;
    }
}


http://www.niftyadmin.cn/n/5869247.html

相关文章

数据保护API(DPAPI)深度剖析与安全实践

Windows DPAPI 安全机制解析 在当今数据泄露与网络攻击日益频繁的背景下,Windows 提供的 DPAPI(Data Protection API)成为开发者保护本地敏感数据的重要工具。本文将从 双层密钥体系、加密流程、跨上下文加密、已知攻击向量与防御措施、企业…

【前端】【面试】【功能函数】写一个JavaScript树形结构操作函数:`filter` 与 `forEach`

写一个JavaScript树形结构操作函数:filter 与 forEach 在JavaScript开发中,处理树形结构数据是一项常见的任务。本文将详细介绍两个用于操作树形结构数据的函数:filter 和 forEach,包括它们的功能、使用方法以及具体示例。 1. f…

ubuntu-server 安装 navidia 显卡驱动

资料 https://juejin.cn/post/7362562720708280332 过程 ubuntu-drivers devices 选择ubuntu-server安装 rootroot:~# ubuntu-drivers devices udevadm hwdb is deprecated. Use systemd-hwdb instead. udevadm hwdb is deprecated. Use systemd-hwdb instead. udevadm hwd…

水利工程安全包括哪几个方面

水利工程安全培训的内容主要包括以下几个方面: 基础知识和技能培训 : 法律法规 :学习水利工程相关的安全生产法律法规,了解安全生产标准及规范。 事故案例 :通过分析事故案例,了解事故原因和教训&#x…

当下弹幕互动游戏源码开发教程及功能逻辑分析

当下很多游戏开发者或者想学习游戏开发的人,想要了解如何制作弹幕互动游戏,比如直播平台上常见的那种,观众通过发送弹幕来影响游戏进程。需要涵盖教程的步骤和功能逻辑的分析。 首先,弹幕互动游戏源码开发教程部分应该分步骤&…

力扣 下一个排列

交换位置,双指针,排序。 题目 下一个排列即在组成的排列中的下一个大的数,然后当这个排列为降序时即这个排列最大,因为大的数在前面,降序排列的下一个数即升序。所以,要是想找到当前排列的下一个排列&…

读书笔记 - 重学Java设计模式

读书笔记 - 重学Java设计模式 第1章 设计模式介绍第2章 六大设计原则单一职责原则定义开闭原则定义里氏替换原则定义迪米特法则定义接口隔离原则定义依赖倒置原则定义 第3章 设计模式如何落地第4章 工厂模式工厂模式介绍模拟发放多种奖品发奖接口三种发奖接口实现优惠券实物商品…

WebRTC学习七:WebRTC 中 STUN 协议详解

系列文章目录 第一篇 基于SRS 的 WebRTC 环境搭建 第二篇 基于SRS 实现RTSP接入与WebRTC播放 第三篇 centos下基于ZLMediaKit 的WebRTC 环境搭建 第四篇 WebRTC学习一:获取音频和视频设备 第五篇 WebRTC学习二:WebRTC音视频数据采集 第六篇 WebRTC学习三…