穿透代理获取用户真实IP地址
文章目录
- 一、场景
- 二、方法
- 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地址相关推荐
- nginx反向代理获取用户真实ip
nginx做反向代理时,默认的配置后端获取到的ip都是来自于nginx,如何转发用户的真实ip到后端程序呢?如是是java后端,用request.getRemoteAddr();获取到的是nginx的 ...
- java获取用户真实IP地址
/*** 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址.* 可是,如果通过了多级反向代理的话,X-Forwarded ...
- CDN下nginx获取用户真实IP地址
为什么80%的码农都做不了架构师?>>> 随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能 ...
- PHP获取用户真实IP地址
PHP获取用户真实IP地址 <?phpfunction getRealIpAddr() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip=$_SER ...
- 获取用户真实Ip地址
REMOTE_ADDR 是你的客户端跟你的服务器"握手"时候的IP.如果使用了"匿名代理",REMOTE_ADDR将显示代理服务器的IP. HTTP_CLIEN ...
- CI获取用户真实IP地址
系统自带的 $this->input->ip_address();
- 获取客户端真实IP地址
Java-Web获取客户端真实IP: 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP. 一般分为两种情况: ...
- JAVA:获取用户访问ip地址
获取用户真实IP地址:不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址: 可是,如果通过了多级反向代理的话,X-Forwarded-For的值 ...
- golang 获取客户端真实IP地址
[Go]获取用户真实的ip地址 用户请求到达提供服务的服务器中间有很多的环节,导致服务获取用户真实的 ip 非常困难,大多数的框架及工具库都会封装各种获取用户真实 ip 的方法,在 exnet 包中也 ...
最新文章
- SQL 判断表是否存在 数据表不存在是致命错误
- 生产者跟消费者问题(C++实现)
- 成功解决OSError: dlopen() failed to load a library: cairo / cairo-2 / cairo-gobject-2 / cairo.so.2
- 一个笑话,关于哲人和普通人的
- 数据结构与算法之递归系列
- get方法 服务器响应,HTTP请求方法及响应码详解(http get post head)
- 【转】.so兼容32位和64位
- 玩玩小爬虫——试搭小架构
- 管理感悟:主管加班,员工才会加班
- CMake实践(2)
- Premiere Pro 2022安装教程(附详细图文教程)
- css绘制卡券优惠券_如何使用css创建一个优惠券
- 时间序列的距离度量DTW
- 超出superView的subview响应方法
- 2014522420145238《信息安全系统设计基础》实验五
- 将扣出的章加入wps里面
- 企业数据中心“云化”转型解决方案
- 手把手解决“npm、node不是内部或外部命令,也不是可运行的程序或批处理文件”
- 如何使用media-server搭建DASH服务
- matlab如何求解sbm模型,非期望产出的SBM模型代码问题