穿透多层代理获得真实ip
1. 使用微信支付时,有的手机ip获取不到外网ip,导致无法支付成功,提示:网络环境未能通过安全验证 请稍后再试
2. 之前使用的方法,只是粗略的,并不能适用所有情况,所有手机。
同时首先确保ngix代理访问api中做了相关配置,如:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
经过综合多种文章,最终实现了多层穿透代理获得真实ip的实现方法:
3. 代码贴上:
public class IPAddressUtils {/*** 获取用户真实IP地址,不使用request.getRemoteAddr()的原因是有可能用户使用了代理软件方式避免真实IP地址,* 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值** 获取终端ip(高配版)* @return ip*/public static String getRealIpAddr(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for");LOGGER.info("x-forwarded-for ip: {}", ip);if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {//可能有代理if(ip.indexOf(".") == -1) { //没有“.”肯定是非IPv4格式ip = null;} else {if (ip.indexOf(",") != -1) {//有“,”,估计多个代理。取第一个不是内网的IP。ip = ip.replace(" ", "").replace("'", "");String[] temparyip = ip.split(",|;");for (int i = 0; i < temparyip.length; i++) {if (isIPAddress(temparyip[i]) && ! isPrivateIp(temparyip[i])) {return temparyip[i];}}} else if(isIPAddress(ip)) { //代理即是IP格式return ip;} else {ip = null; //代理中的内容 非IP,取IP}}}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");LOGGER.info("Proxy-Client-IP: {}", ip);}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");LOGGER.info("WL-Proxy-Client-IP: {}", ip);}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_CLIENT_IP");LOGGER.info("HTTP_CLIENT_IP: {}", ip);}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_X_FORWARDED_FOR");LOGGER.info("HTTP_X_FORWARDED_FOR: {}", ip);}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("X-Real-IP");LOGGER.info("X-Real-IP: {}", ip);}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();LOGGER.info("getRemoteAddr-IP: {}", ip);}LOGGER.info("=====获取客户端ip: {}", ip);return ip;}/*** 是否私有ip地址** 在IPv4中,私有地址的范围分别是:* A类地址范围:10.0.0.0—10.255.255.255* B类地址范围:172.16.0.0---172.31.255.555* C类地址范围:192.168.0.0---192.168.255.255* @param tmpIp* @return*/public static boolean isPrivateIp(String tmpIp) {LOGGER.info("isPrivateIp:{}", tmpIp);if(StringUtils.isBlank(tmpIp)) {return false;}if("10.".equals(tmpIp.substring(0, 3)) || "192.168".equals(tmpIp.substring(0, 7))) {return true;}if("172.".equals(tmpIp.substring(0, 4))) {String subStr = tmpIp.substring(4, 7);LOGGER.info("isPrivateIp-subStr:{}", subStr);Integer subNum = Integer.valueOf(tmpIp.substring(4, 6));LOGGER.info("isPrivateIp-subNum:{}", subNum);if(subStr.endsWith(".") && subNum > 15 && subNum < 32) {return true;}}return false;}public static boolean isIPAddress(String str1) {if(StringUtils.isBlank(str1) || str1.length() < 7 || str1.length() > 15) return false;String regformat = "^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$";return str1.matches(regformat);}
}
穿透多层代理获得真实ip相关推荐
- django+vue+nginx+frp搭建漫画网站之获取访客真实ip(二)
地址:http://www.iewoai.com/ 1.背景 最近听室友说,他网站有监控访客的ip,并通过钉钉通知的服务.于是我在想,我为什么不给漫画网站加这个服务呢,说整就整,首先得获取到真实ip. ...
- nginx多层反向代理获取客户端真实ip
访问路径: 用户 --> www.chinasoft.cn(nginx反向代理) --> www.chinasoft.com(nginx反向代理) --> python服务端程序经过 ...
- 穿透代理获取用户真实IP地址
文章目录 一.场景 二.方法 1.微信官方方法 (1)没有代理 (2)有代理 2.非官方方法 (1)代码 (2)说明 (3)补充 一.场景 在对接微信H5支付API时,有一关键步骤是获取到用户的真实I ...
- Nginx在多层代理下获取真实客户端IP地址
最近在研究nginx中如何获取真实客户端IP的方法.众所周知,在编译Nginx时,可通过添加http_realip_module模块来获取真实客户端IP地址.何为真实IP地址呢?请看下图,既获取到的真 ...
- nginx经过多层代理后获取真实来源ip
nginx取 $remote_addr 当做真实ip,而事实上,$http_X_Forwarded_For 才是用户真实ip,$remote_addr只是代理上一层的地址 解决方案: 在 http 模 ...
- 学习笔记 - Nginx在多层代理下获取真实客户端IP地址
最近在研究nginx中如何获取真实客户端IP的方法.众所周知,在编译Nginx时,可通过添加http_realip_module模块来获取真实客户端IP地址.何为真实IP地址呢?请看下图,既获取到的真 ...
- 代理、转发等多种场景下,如何获取用户真实IP?
原文:http://www.yunweipai.com/archives/14456.html 1 概述 工作中会经常碰到需要进行转发之类的需求,比如LVS转发.NAT转发,或者在BGP网络架设一个端 ...
- nginx curl命令有效 curl_setopt无效_日志分析系列(外传一):Nginx透过代理获取真实客户端IP...
本系列中的故事纯属虚构,如有雷同实属巧合 小B是Q公司的安全攻城狮,为了完成任务小B开始做起了调研(欲知背景如何,且听下回分说). 首先小B弄明白了Q公司的应用系统架构是:Client --> ...
- 使用nginx代理的情况下获取用户真实IP
##1.背景知识 1.1. 前提知识点: 还有nginx中的几个变量: remote_addr 代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站 ...
最新文章
- PAT甲级1112 Stucked Keyboard:[C++题解]卡住的键盘、双指针、去重
- 计算圆形是否和正方形相交 【微软面试100题 第二十三题】
- 深入详解windows安全认证机制ntlmKerberos
- python 连接mysql 字符集_Python 操作 MySQL 字符集的问题
- 启动日志_Hybris服务器启动日志分析
- 洛谷 P3381 【模板】最小费用最大流
- mysql 5.6.31 winx64_详解介绍MySQL5.6.31winx64.zip安装配置的图文教程
- linux mint python3.6,Linux 上如何安装并切换最新版本的 Python 3.6
- 牧马人鼠标g13鼠标宏_达尔优第五代牧马人EM915游戏鼠标评测
- 使用从mysql中取数据
- 什么叫单模光纤_什么是单模单纤/双纤光纤收发器?二者有何区别?
- 你选书我买单,包邮送55本!ggplot2、R语言、Python任意什么书都可以!
- envi安装成功教程 附下载地址
- 一键seo提交收录_百度网站提交,选择主动提交,还是被动收录?
- Stronger (What Doesn't Kill You)
- 计算机科学家的名言警句,【实用】励志的格言70句
- Python——实现防止微信撤回消息
- 个人新出的书籍---《云计算网络珠玑》
- 4.1 使用常见的各种字体属性 [原创Excel教程]
- 产品负责人(Product Owner)的主要职责和技能
热门文章
- android室内定位传感器辅助pdr jar,基于Android的PDR和WiFi指纹融合室内定位技术研究...
- 福大计算机课程表,福州大学研究生院-通知公告-福州大学课程表(非全日制工程硕士研究生2017年周末班公共课3-5月份 )...
- python爬虫从入门到放弃(一)初识爬虫
- 工业相机概述-选型事项-生产厂家汇总
- 免费好用的PC端屏幕录制软件
- 深度学习理论与实践第二章作业-FNN手写数字识别
- vue项目中扫码枪收款
- 凤凰金融张震:互联网金融将进入3.0时代
- uniapp上传、预览、删除图片
- AE PR模板基本图形预设素材包动态字幕文字标题排版动画预设效果