当前位置: 首页 > 面试题库 >

什么是获取请求的ip的正确方法

惠洛华
2023-03-14
问题内容

我发现了一些在servlet中获取ip的方法。但我不知道哪一个是正确的,为什么。

1:

request.getHeader( "X-Real-IP" )

2:

  String ip = request.getHeader("X-Forwarded-For"); 
  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("WL-Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("HTTP_CLIENT_IP");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getRemoteAddr();  
    } `

3:

 String ip=request.getHeader("x-forwarded-for");
                if(ip==null){
                    ip=request.getRemoteAddr();
                }
                String ips[]=ip.split(",");`
                                ip=ips[0];

问题答案:

答案很复杂。

  • 如果您的Servlet在反向代理或负载平衡器后面的Web服务器上运行,则可以将该Web代理配置为注入请求标头,该标头提供了请求来自的IP地址。不同的反向代理将注入不同的标头。请查阅您的(前端)服务器的文档。

  • 如果您的客户端使用(转发)代理,则它 可能会 插入标头以说明客户端IP地址是…还是可能不。并且它插入的IP地址 可能 不正确。

  • 您通过调用获得的值将request.getRemoteAddr()是请求的 直接 上游源的IP地址。

您列出的标头都不是标准的,但是“ x-forwarded-
for”被认为是事实上的标准。也就是说,它是最有可能被代理插入的对象,等等…如果注入了任何东西。

最后,即使您确实获得了IP地址,也不一定能为您提供帮助。例如,如果客户端位于专用网络上并通过NAT网关连接到Internet,则HTTP请求中的IP地址将是NAT服务器的地址,而不是实际的客户端IP。

那么,这意味着什么?好吧,基本上,这意味着 通常 您不能 可靠地 找到请求所源自的系统的IP地址。



 类似资料:
  • 中的数据如下: 我用这段代码获取数据帧中速度为0的数据,然后根据纬度、经度、年、月、日对数据帧进行分组。 分组后,获取每组的第一个和最后一个。如果第一个和最后一个之间的差异超过5分钟,则获取每组的第一行数据,并最终将这些数据保存到csv中。 我认为我的代码不够简洁。 我使用要获取数据帧中的第一行,我使用和获取特定列的第一个元素和最后一个元素。 还有更合适的方法吗? 我的代码:

  • 我试图制作一个测试应用程序,这样我就可以使用LocationManager,但我甚至无法在运行时通过新的愚蠢的权限请求。我做错了什么,为什么他们让这变得如此混乱/复杂?

  • 问题内容: 这是我的JSF页面: 和豆 当我传递这样的参数时:/getshipment.xhtml?id=123 我得到输出 1 = 2 = 123 3 = 123 第二和第三种方法工作正常。为什么第一个不工作?什么是获取参数的正确方法? 问题答案: 尝试使用GlassFish 4至少使用2.2.2。先前的2.2.x Mojarra版本与新的JSF名称空间存在众所周知的兼容性问题。

  • 问题内容: 在Angular1中,可以通过配置$ http-provider解决此问题。喜欢: 在Angular2中做同样的事情是什么好习惯? 在Angular2中使用http请求,我们需要使用Http类。当然,将CSRF行添加到每个后功能调用中不是一个好习惯。 我猜在Angular2中,我应该创建自己的类,该类继承Angular2的Http类并重新定义后功能。是正确的方法还是更优雅的方法? 问题

  • 这是正确的吗?有没有更好的方法来构建这个?这能覆盖我所有的基础吗?

  • 问题内容: 从中获取所有客户端IP地址的正确方法是什么?在其中,我应该检查很多变量。Go上也一样吗? 我发现的一个是: 并且请求区分大小写吗?例如与和相同吗?(来自) 问题答案: 查看http.Request,您可以找到以下成员变量: 您可以用来获取远程客户端的IP地址和端口(格式为“ IP:端口”),它是原始请求者 或最后一个代理 (例如,位于服务器前面的负载平衡器)的地址。 这就是您确定的全部