文章目录

  • 一、场景
  • 二、方法
    • 1、微信官方方法
      • (1)没有代理
      • (2)有代理
    • 2、非官方方法
      • (1)代码
      • (2)说明
      • (3)补充

一、场景

在对接微信H5支付API时,有一关键步骤是获取到用户的真实IP,微信开发文档给出的解释为:

H5支付要求商户在统一下单接口中上传用户真实ip地址“spbill_create_ip”,
为保证微信端获取的用户ip地址与商户端获取的一致.

二、方法

1、微信官方方法

(1)没有代理

function get_client_ip()
{$cip = "unknown";if ($_SERVER['REMOTE_ADDR']){$cip = $_SERVER['REMOTE_ADDR'];}elseif (getenv("REMOTE_ADDR"){$cip = getenv("REMOTE_ADDR");}return $ip
}

(2)有代理

有代理的情况下,因为要代替客户端去访问服务器,而代理服务器这里的IP数据报的包头做了修改,这样一来,后端程序就无法获取到用户的真实IP。

nginx代理情况:
在nginx配置中加入:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Apache代理的情况:

vi /usr/local/apache/conf/httpd.conf
Include conf/extra/httpd-remoteip.conf
vi /usr/local/apache/conf/extra/httpd-remoteip.conf
LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1

博主备注:腾讯文档依旧保持尽可能让读者搞不懂的态度,所以下面给出简单可行的方法。

2、非官方方法

以下只使用Java开发语言

(1)代码

private static final String[] headInfo = { "X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP","HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_CLIENT_IP","HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "REMOTE_ADDR", "PROXY_FORWARDED_FOR", "X-Real-IP"};/*** * getClientIpAddress:(获取用户ip,可穿透代理).* @author SongYapeng* @Date 2018年3月2日下午4:41:47* @param request* @since JDK 1.8*/public static String getClientIpAddress(HttpServletRequest request) {for (String header : headInfo) {String ip = request.getHeader(header);if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {if (ip != null && ip.indexOf(",") != -1) {String[] ips = ip.split(",");for (int i = 0; i < ips.length; i++) {String ipMulti = (String) ips[i];if (!("unknown".equalsIgnoreCase(ipMulti))) {ip = ipMulti;break;}}}return ip;}}return request.getRemoteAddr();}

(2)说明

没有代理的情况下使用request.getRemoteAddr() 可以正常获取到客户端的IP地址。
但是,秉承着别人没问题自己必然出Bug的传统,大多数情况下,总是获取到的是本地IP。

通过了解到反向代理修改了数据报的头部,上面headInfo数组中罗列了代理后HTTP头信息中可能增加的信息字段。

通过方法getClientIpAddress(),可穿透代理获取到用户真实IP。

(3)补充

上面方法不能保证百分之百没问题,因为不同的代理服务器可能需要不同的配置。我们使用的是F5负载均衡,效果不太理想,后通过运维大哥在F5上配置X-Forwarded-For后才得以实现。

穿透代理获取用户真实IP地址相关推荐

  1. nginx反向代理获取用户真实ip

    nginx做反向代理时,默认的配置后端获取到的ip都是来自于nginx,如何转发用户的真实ip到后端程序呢?如是是java后端,用request.getRemoteAddr();获取到的是nginx的 ...

  2. java获取用户真实IP地址

    /*** 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址.* 可是,如果通过了多级反向代理的话,X-Forwarded ...

  3. CDN下nginx获取用户真实IP地址

    为什么80%的码农都做不了架构师?>>>    随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能 ...

  4. PHP获取用户真实IP地址

    PHP获取用户真实IP地址 <?phpfunction getRealIpAddr() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip=$_SER ...

  5. 获取用户真实Ip地址

    REMOTE_ADDR 是你的客户端跟你的服务器"握手"时候的IP.如果使用了"匿名代理",REMOTE_ADDR将显示代理服务器的IP. HTTP_CLIEN ...

  6. CI获取用户真实IP地址

    系统自带的 $this->input->ip_address();

  7. 获取客户端真实IP地址

    Java-Web获取客户端真实IP: 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP. 一般分为两种情况: ...

  8. JAVA:获取用户访问ip地址

    获取用户真实IP地址:不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址: 可是,如果通过了多级反向代理的话,X-Forwarded-For的值 ...

  9. golang 获取客户端真实IP地址

    [Go]获取用户真实的ip地址 用户请求到达提供服务的服务器中间有很多的环节,导致服务获取用户真实的 ip 非常困难,大多数的框架及工具库都会封装各种获取用户真实 ip 的方法,在 exnet 包中也 ...

最新文章

  1. SQL 判断表是否存在 数据表不存在是致命错误
  2. 生产者跟消费者问题(C++实现)
  3. 成功解决OSError: dlopen() failed to load a library: cairo / cairo-2 / cairo-gobject-2 / cairo.so.2
  4. 一个笑话,关于哲人和普通人的
  5. 数据结构与算法之递归系列
  6. get方法 服务器响应,HTTP请求方法及响应码详解(http get post head)
  7. 【转】.so兼容32位和64位
  8. 玩玩小爬虫——试搭小架构
  9. 管理感悟:主管加班,员工才会加班
  10. CMake实践(2)
  11. Premiere Pro 2022安装教程(附详细图文教程)
  12. css绘制卡券优惠券_如何使用css创建一个优惠券
  13. 时间序列的距离度量DTW
  14. 超出superView的subview响应方法
  15. 2014522420145238《信息安全系统设计基础》实验五
  16. 将扣出的章加入wps里面
  17. 企业数据中心“云化”转型解决方案
  18. 手把手解决“npm、node不是内部或外部命令,也不是可运行的程序或批处理文件”
  19. 如何使用media-server搭建DASH服务
  20. matlab如何求解sbm模型,非期望产出的SBM模型代码问题

热门文章

  1. mysql积累--面试题
  2. u盘属于计算机软件吗,u盘属于哪一类商标
  3. 新建Maven工程乱七八糟全都失效了
  4. Leetcode2169. 得到 0 的操作数
  5. android 10.0 禁止安装apk
  6. Android修行手册 - Toolbar实践
  7. 根据刚刚,1分钟前,1小时前,几天前显示文章发布日期
  8. 解决电脑“自动修复 电脑未正确启动/无法修复你的电脑”
  9. 为什么你今年的百度产品经理面试挂了?
  10. Python h5py安装 HDF5 library version mismatched error