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相关推荐

  1. django+vue+nginx+frp搭建漫画网站之获取访客真实ip(二)

    地址:http://www.iewoai.com/ 1.背景 最近听室友说,他网站有监控访客的ip,并通过钉钉通知的服务.于是我在想,我为什么不给漫画网站加这个服务呢,说整就整,首先得获取到真实ip. ...

  2. nginx多层反向代理获取客户端真实ip

    访问路径: 用户 --> www.chinasoft.cn(nginx反向代理) --> www.chinasoft.com(nginx反向代理) --> python服务端程序经过 ...

  3. 穿透代理获取用户真实IP地址

    文章目录 一.场景 二.方法 1.微信官方方法 (1)没有代理 (2)有代理 2.非官方方法 (1)代码 (2)说明 (3)补充 一.场景 在对接微信H5支付API时,有一关键步骤是获取到用户的真实I ...

  4. Nginx在多层代理下获取真实客户端IP地址

    最近在研究nginx中如何获取真实客户端IP的方法.众所周知,在编译Nginx时,可通过添加http_realip_module模块来获取真实客户端IP地址.何为真实IP地址呢?请看下图,既获取到的真 ...

  5. nginx经过多层代理后获取真实来源ip

    nginx取 $remote_addr 当做真实ip,而事实上,$http_X_Forwarded_For 才是用户真实ip,$remote_addr只是代理上一层的地址 解决方案: 在 http 模 ...

  6. 学习笔记 - Nginx在多层代理下获取真实客户端IP地址

    最近在研究nginx中如何获取真实客户端IP的方法.众所周知,在编译Nginx时,可通过添加http_realip_module模块来获取真实客户端IP地址.何为真实IP地址呢?请看下图,既获取到的真 ...

  7. 代理、转发等多种场景下,如何获取用户真实IP?

    原文:http://www.yunweipai.com/archives/14456.html 1 概述 工作中会经常碰到需要进行转发之类的需求,比如LVS转发.NAT转发,或者在BGP网络架设一个端 ...

  8. nginx curl命令有效 curl_setopt无效_日志分析系列(外传一):Nginx透过代理获取真实客户端IP...

    本系列中的故事纯属虚构,如有雷同实属巧合 小B是Q公司的安全攻城狮,为了完成任务小B开始做起了调研(欲知背景如何,且听下回分说). 首先小B弄明白了Q公司的应用系统架构是:Client --> ...

  9. 使用nginx代理的情况下获取用户真实IP

    ##1.背景知识 1.1. 前提知识点: 还有nginx中的几个变量: remote_addr 代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站 ...

最新文章

  1. PAT甲级1112 Stucked Keyboard:[C++题解]卡住的键盘、双指针、去重
  2. 计算圆形是否和正方形相交 【微软面试100题 第二十三题】
  3. 深入详解windows安全认证机制ntlmKerberos
  4. python 连接mysql 字符集_Python 操作 MySQL 字符集的问题
  5. 启动日志_Hybris服务器启动日志分析
  6. 洛谷 P3381 【模板】最小费用最大流
  7. mysql 5.6.31 winx64_详解介绍MySQL5.6.31winx64.zip安装配置的图文教程
  8. linux mint python3.6,Linux 上如何安装并切换最新版本的 Python 3.6
  9. 牧马人鼠标g13鼠标宏_达尔优第五代牧马人EM915游戏鼠标评测
  10. 使用从mysql中取数据
  11. 什么叫单模光纤_什么是单模单纤/双纤光纤收发器?二者有何区别?
  12. 你选书我买单,包邮送55本!ggplot2、R语言、Python任意什么书都可以!
  13. envi安装成功教程 附下载地址
  14. 一键seo提交收录_百度网站提交,选择主动提交,还是被动收录?
  15. Stronger (What Doesn't Kill You)
  16. 计算机科学家的名言警句,【实用】励志的格言70句
  17. Python——实现防止微信撤回消息
  18. 个人新出的书籍---《云计算网络珠玑》
  19. 4.1 使用常见的各种字体属性 [原创Excel教程]
  20. 产品负责人(Product Owner)的主要职责和技能

热门文章

  1. android室内定位传感器辅助pdr jar,基于Android的PDR和WiFi指纹融合室内定位技术研究...
  2. 福大计算机课程表,福州大学研究生院-通知公告-福州大学课程表(非全日制工程硕士研究生2017年周末班公共课3-5月份 )...
  3. python爬虫从入门到放弃(一)初识爬虫
  4. 工业相机概述-选型事项-生产厂家汇总
  5. 免费好用的PC端屏幕录制软件
  6. 深度学习理论与实践第二章作业-FNN手写数字识别
  7. vue项目中扫码枪收款
  8. 凤凰金融张震:互联网金融将进入3.0时代
  9. uniapp上传、预览、删除图片
  10. AE PR模板基本图形预设素材包动态字幕文字标题排版动画预设效果