首页 欧冠最新报道正文

凉粉的做法,Java面试-怎么获取客户端实在IP-雷火电竞安卓app

admin 欧冠最新报道 2019-11-05 167 0

在进行一些小游戏开发时,咱们常常比较重视的一个功用便是共享。针对共享,咱们希望能依据各个城市或许区域,能有不同的共享案牍,辨识区域的功用假如由服务器来完结的话,咱们就需求知道客户端的实在IP。今日咱们就来看看服务器是怎么获取到客户端的实在IP的。

nginx装备

首要,一个恳求肯定是能够分为恳求头和恳求体的,而咱们客户端的IP地址信息一般都是存储在恳求头里的。假如你的服务器有用Nginx做负载均衡的话,你需求在你的location里边装备X-Real-IP和X-Forwarded-For恳求头:

 location ^~ /your-service/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:60000/your-service/;
}

X-Real-IP

在《实战nginx》中,有这么一句话:

经过反向署理后,因为在客户端和web服务器之间增加了中间层,因而web服务器无法直接拿到客户端的ip,经过$remote_addr变量拿到的将是反向署理服务器的ip地址。

这句话的意思是说,当你运用了nginx反向服务器后,在web端运用request.getRemoteAddr()(本质上便是获取$remote_addr),取得的是nginx的地址,即$remote_addr变量中封装的是nginx的地址,当然是无法取得用户的实在ip的。可是,nginx是能够取得用户的实在ip的,也便是说nginx运用$remote_addr变量时取得的是用户的实在ip,假如咱们想要在web端取得用户的实在ip,就必须在nginx里作一个赋值操作,即我在上面的装备:

proxy_set_header X-Real-IP $remote_addr;

X-Forwarded-For

X-Forwarded-For变量,这是一个squid开发的,用于辨认经过HTTP署理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc规范,假如有做X-Forwarded-For设置的话,每次经过proxy转发都会有记载,格局便是client1,proxy1,proxy2以逗号离隔各个地址,因为它对错rfc规范,所以默许是没有的,需求强制增加。在默许情况下经过proxy转发的恳求,在后端看来长途地址都是proxy端的ip 。也便是说在默许情况下咱们运用request.getAttribute("X-Forwarded-For")获取不到用户的ip,假如咱们想要经过这个变量取得用户的ip,咱们需求自己在nginx增加装备:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

意思是增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,留意是增加,而不是掩盖,当然因为默许的X-Forwarded-For值是空的,所以咱们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你建立两台nginx在不同的ip上,而且都运用了这段装备,那你会发现在web服务器端经过request.getAttribute("X-Forwarded-For")取得的将会是客户端ip和第一台nginx的ip。

那么$proxy_add_x_forwarded_for又是什么?

$proxy_add_x_forwarded_for变量包括客户端恳求头中的X-Forwarded-For与$remote_addr两部分,他们之间用逗号分隔。

举个比方,有一个web运用,在它之前经过了两个nginx转发,www.linuxidc.com即用户拜访该web经过两台nginx。

在第一台nginx中,运用:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量的X-Forwarded-For部分是空的,所以只要$remote_addr,而$remote_addr的值是用户的ip,所以赋值今后,X-Forwarded-For变量的值便是用户的实在的ip地址了。

到了第二台nginx,运用:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包括的是用户的实在ip,$remote_addr部分的值是上一台nginx的ip地址,所以经过这个赋值今后现在的X-Forwarded-For的值就变成了“用户的实在ip,第一台nginx的ip”,这样就清楚了吧。

服务器获取实在IP

代码为:

 public static String getIpAddress(HttpServletRequest request) {
String Xip = request.getHeader("X-Real-IP");
String XFor = request.getHeader("X-Forwarded-For");
if (!Strings.isNullOrEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) {
//屡次反向署理后会有多个ip值,第一个ip才是实在ip
int index = XFor.indexOf(",");
if (index != -1) {
return XFor.substring(0, index);
} else {
return XFor;
}
}
XFor = Xip;
if (!Strings.isNullOrEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) {
return XFor;
}
if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("Proxy-Client-IP");
}
if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("WL-Proxy-Client-IP");
}
if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_CLIENT_IP");
}
if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getRemoteAddr();
}
return XFor;
}

咱们来看看各个恳求头的意义

X-Real-IP

nginx署理一般会加上此恳求头。

X-FORWARDED-FOR

这是一个Squid开发的字段,只要在经过了HTTP署理或许负载均衡服务器时才会增加该项。

Proxy-Client-IP 和 WL-Proxy-Client-IP

这个一般是经过apache http服务器的恳求才会有,用apache http做署理时一般会加上Proxy-Client-IP恳求头,而WL-Proxy-Client-IP是它的weblogic插件加上的头。

HTTPCLIENTIP

有些署理服务器会加上此恳求头。在网上搜了一下,有一个说法是:

这是一般的 http header,假造起来很简单,不要容易信赖用户输入。 
curl -H 'client-ip: 8.8.8.8' lidian.club/phpinfo.php | grep _SERVER
你就能看到 _SERVER["HTTP_CLIENT_IP"] 了。
client-ip 和 client-host 是在 NAPT 还没遍及的时代,企业内网假定的 http 通明署理,传给服务器的 header,只要极少数厂家用过,历来不是规范,也历来没成为过事实规范。
(我们最了解的事实规范便是 x-forwarded-for)
后来呈现的 web proxy 也没见用过这个 header。
TCP/IP Illustrated Vol 3 没有讲过这个 header,网上的传言不可信。
可考的最早痕迹呈现在2005年,日本一部 Perl/CGI 秘籍(9784798010779,270页)经过 client-ip 与 via 两个 header 屏蔽署理用户拜访。

HTTPXFORWARDED_FOR

简称XFF头,它代表客户端,也便是HTTP的恳求端实在的IP,只要在经过了HTTP 署理(比方APACHE署理)或许负载均衡服务器时才会增加该项。它不是RFC中界说的规范恳求头信息,在squid缓存署理服务器开发文档中能够找到该项的具体介绍。假如有该条信息, 阐明您运用了署理服务器,地址便是后边的数值。能够假造。规范格局如下:X-Forwarded-For: client1, proxy1, proxy2

总结

以上便是我在处理客户端实在IP的办法,假如你有什么定见或许主张,能够在下方留言。

有爱好的话能够重视我的大众号或许头条号,说不定会有意外的惊喜。

雷火电竞版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

最近发表

    雷火电竞安卓app_雷火电竞app下载_雷火竞技竞猜平台

    http://www.mr-sportsman.com/

    |

    Powered By

    使用手机软件扫描微信二维码

    关注我们可获取更多热点资讯

    雷火电竞出品