首页 > 编程知识 正文

request获取服务器ip(java获取本机ip地址端口号)

时间:2023-05-04 16:41:16 阅读:76667 作者:2307

在进行一些小游戏开发时,我们关注的功能之一是共享。 根据各个城市和地区,我们希望共享不同的副本。 如果在服务器上执行识别区域的功能,则需要知道客户端的实际IP。 今天,让我们来看看服务器是如何获取客户端的实际IP的。

在nginx配置中,首先,一个请求总是分为请求标头和请求主体,但我们客户端的IP地址信息通常存储在请求标头中。 如果服务器在Nginx上平衡负载,则必须在位置配置X-Real-IP和X-Forwarded-For请求标头。

位置^~~/your-service/{ proxy _ set _ headerx-real-IP $ remote _ addr; proxy _ set _ headerx-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使用$remote_addr变量时获取的是用户的真正ip。 要在web端获取用户的真正ip,必须在nginx上进行赋值操作。 也就是说,我有上述结构。

proxy _ set _ headerx-real-IP $ remote _ addr; 前向x-for x-forwarded-for变量。 这是由squid开发的非rfc标准,用于标识通过HTTP代理或负载平衡器从原始IP连接到Web服务器的客户端地址,每次都通过代理传输X-Forwarded-For设置(如果有) 这意味着默认情况下无法使用request.getattribute ' x-forwarded-for '获取用户的ip。 要使用此变量获取用户的ip,必须自己将配置添加到nginx中。

proxy _ set _ headerx-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的值相同实际上,我们用俊逸的短靴在单独的ip上构建了两台nginx,并使用了这种配置。 可以看到在web服务器端通过request.gor

那么,$proxy_add_x_forwarded_for是什么?

$proxy_add_x_forwarded_for变量包含两部分:客户端请求标头的X-Forwarded-For和$remote_addr,并用逗号分隔

例如,有一个以前在两个nginx上传输的web APP应用程序。 在www.linuxidc.com上,用户访问该web并通过两个nginx。

第一个nginx使用以下内容:

proxy _ set _ headerx-forwarded-for $ proxy _ add _ x _ forwarded _ for; 当前$proxy_add_x_forwarded_for变量的X-Forwarded-For部分为空,因此只有$remote_addr。 然后,$remote_addr的值是用户的ip,因此稍后再赋值

到达第二台nginx后,使用:

proxy _ set _ headerx-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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。