服务端获取远程ip的方法

news/2025/2/27 0:30:31/

在业务系统中,通常需要获取用户的真实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才是真实ipint 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.ppmy.cn/news/1575121.html

相关文章

Vue实践-ElementUI中Upload组件如何批量上传

ElementUI中Upload组件如何批量上传 首先就是upload组件 <el-uploadclass"upload-demo"ref"uploadFile"name"filedatas":headers"importHeaders":action"uploadAdminHost":auto-upload"false"multiple><…

Mono里运行C#脚本43—System.Console.WriteLine()函数的生成过程

前面可以看到脚本里会有下面的代码生成: IL_0005: call void class [mscorlib]System.Console::WriteLine(string) 现在就来分析这行代码的JIT的生成过程。 在这里调用的代码是库里代码,与前面内部嵌入的函数会不一样。并且它是一个类里的方法,这样也与前面的内部函数不…

MFC—加法器

1.需要为编辑框添加变量 2.在cpp文件中的按钮中添加代码 void CMFCAddtionDlg::OnBnClickedButton1() {// TODO: 在此添加控件通知处理程序代码UpdateData(true);//把控件里的值更新给变量m_add m_add1 m_add2;//加法UpdateData(false);//把控件相加的值赋值给控件 }

【Leetcode 每日一题】1656. 设计有序流

问题背景 有 n n n 个 ( i d , v a l u e ) (id, value) (id,value) 对&#xff0c;其中 i d id id 是 1 1 1 到 n n n 之间的一个整数&#xff0c; v a l u e value value 是一个字符串。不存在 i d id id 相同的两个 ( i d , v a l u e ) (id, value) (id,value) 对。…

MacOS安装Emacs

个人博客地址&#xff1a;MacOS安装Emacs | 一张假钞的真实世界 在MacOS X上可以使用Homebrew 安装Emacs&#xff1a; $ brew install emacs --with-cocoa 或者用MacPorts&#xff1a; $ sudo port install emacs-app OSX Emacs 网站提供了通用的二进制包。 前两种方法安装…

使用 pytest-mock 进行 Python 高级单元测试与模拟

一、单元测试与模拟的意义 在软件开发中,单元测试用于验证代码逻辑的正确性。但实际项目中,代码常依赖外部服务(如数据库、API、文件系统)。直接测试这些依赖会导致: 测试速度变慢测试结果不可控产生副作用(如真实发送邮件)模拟(Mocking) 技术通过创建虚拟对象替代真…

环境安装与配置:全面了解 Go 语言的安装与设置

在学习 Go 语言之前&#xff0c;首先需要确保开发环境已正确安装和配置。本部分将详细介绍如何在不同平台&#xff08;Windows、macOS 和 Linux&#xff09;上安装 Go 语言&#xff0c;以及如何进行环境变量配置和工作空间的设置。 一、安装 Go 语言 1. Windows 安装方法 下载…

牛客周赛 Round 82(思维、差分、树状数组、大根堆、前后缀、递归)

文章目录 牛客周赛 Round 82&#xff08;思维、差分、树状数组、大根堆、前后缀、递归&#xff09;A. 夹心饼干B. C. 食堂大作战&#xff08;思维&#xff09;D. 小苯的排列计数(差分、树状数组)E. 和和&#xff08;大根堆&#xff0c;前缀和&#xff09;F. 怎么写线性SPJ &…