返回顶部
首页 > 资讯 > 精选 >Java中如何获取客户端真实IP
  • 441
分享到

Java中如何获取客户端真实IP

2023-06-02 15:06:44 441人浏览 安东尼
摘要

今天就跟大家聊聊有关Java中如何获取客户端真实IP,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Nginx配置首先,一个请求肯定是可以分为请求头和请求体的,而我们客户端的IP地址信

今天就跟大家聊聊有关Java中如何获取客户端真实IP,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

Java中如何获取客户端真实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 屏蔽代理用户访问。

简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理(比如APACHE代理)或者负载均衡服务器时才会添加该项。它不是RFC中定义的标准请求头信息,在squid缓存代理服务器开发文档中可以找到该项的详细介绍。如果有该条信息, 说明您使用了代理服务器,地址就是后面的数值。可以伪造。

看完上述内容,你们对Java中如何获取客户端真实IP有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: Java中如何获取客户端真实IP

本文链接: https://lsjlt.com/news/230357.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中如何获取客户端真实IP
    今天就跟大家聊聊有关Java中如何获取客户端真实IP,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。nginx配置首先,一个请求肯定是可以分为请求头和请求体的,而我们客户端的IP地址信...
    99+
    2023-06-02
  • nginx如何获取真实客户端ip
    nginx作为反向代理服务器,即代理我们的服务端,下面介绍下如何配置nginx获取真实的客户端ip 配置nginx.con server { listen 80; server_name l...
    99+
    2023-10-20
    nginx tcp/ip java
  • Java中怎么获取客户端真实IP地址
    本篇文章给大家分享的是有关Java中怎么获取客户端真实IP地址,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在JSP里,获取客户端的IP地址的方法是:request.getRe...
    99+
    2023-06-17
  • Nginx代理后获取客户端真实IP地址
    1、场景 在项目实际应用中,我们可能会需要获取到用户也就是客户端的真实IP地址,比如记录系统操作日志等情况。 2、使用 通常情况下我们可以使用以下方式来获取IP地址 request.getRemoteAddr() 但是当我们使用Nginx反...
    99+
    2023-09-06
    java获取用户真实IP地址 nginx获取用户真实IP地址
  • java怎么实现获取客户端ip地址
    这篇“java怎么实现获取客户端ip地址”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java怎么实现获取客户端ip地址”文...
    99+
    2023-06-29
  • PHP中怎么获取客户端IP
    PHP中怎么获取客户端IP,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、没有使用代理服务器的PHP获取客户端IP情况:REMOTE_ADDR = 客户端IPHTTP_X...
    99+
    2023-06-17
  • 项目中Nginx多级代理是如何获取客户端的真实IP地址
    目录多级代理中获取客户端真实IP日志的格式获取客户端真实IP总结:多级代理中获取客户端真实IP 日志的格式 nginx中常用日志格式配置如下: log_format main '...
    99+
    2024-04-02
  • 如何使用 Go 获取客户端 DNS IP
    学习知识要善于思考,思考,再思考!今天编程网小编就给大家带来《如何使用 Go 获取客户端 DNS IP》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一...
    99+
    2024-04-04
  • java如何实现获取客户端ip地址的示例代码
    目录一、前言二、摘要  三、java实现获取客户端ip 一、前言 环境:jdk1.8 + idea2019.3 + Windows10 二、摘要&nbs...
    99+
    2024-04-02
  • 基于nginx获取代理服务ip以及客户端真实ip详解
    目录一、问题背景二、proxy_set_header 语法三、X-Real-IP四、X-Forwarded-For总结 一、问题背景 在实际应用中,我们可能需要获取用户的i...
    99+
    2024-04-02
  • Nginx反向代理后无法获取客户端真实IP地址
    目录1、原始配置文件如下2、配置转发后当我们使用 Nginx 代理转发服务后,会发现我们无法获取客户端的真实IP地址,从而无法获取客户端的地理位置等信息。 1、原始配置文件如下 wo...
    99+
    2023-03-06
    Nginx反向代理获取IP地址 Nginx代理IP地址
  • WordPress 使用 CDN 后获取访客真实 IP
    WordPress 往数据库存 IP 的时候似乎用的是 REMOTE_ADDR,这样一来数据库里面的评论信息就全是从各个 CDN 服务器来的 IP。 在 wp-config.php 文件中增加下面代码...
    99+
    2023-09-27
    tcp/ip 数据库 php
  • Nginx反向代理后无法获取客户端真实IP地址怎么解决
    这篇文章主要介绍“Nginx反向代理后无法获取客户端真实IP地址怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Nginx反向代理后无法获取客户端真实IP地址怎么解决”文章能帮助大家解决问题。...
    99+
    2023-07-05
  • PHP获取当前用户的真实IP
    在 PHP 中可通过 $_SERVER 全局变量获取客户端IP,常用的有以下两个变量: $_SERVER['REMOTE_ADDR'] :浏览当前页面的用户的 IP 地址$_SERVER['HTTP_...
    99+
    2023-09-07
    php tcp/ip 网络
  • 在Java项目中使用Request怎么实现获取客户端的IP地址
    今天就跟大家聊聊有关在Java项目中使用Request怎么实现获取客户端的IP地址,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在JSP里,获取客户端的IP地址的方法是:reques...
    99+
    2023-05-31
    request java ip地址
  • springboot如何获取真实ip地址
    这篇“springboot如何获取真实ip地址”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springboot如何获取真实...
    99+
    2023-06-30
  • Java-通过IP获取真实地址
    文章目录 前言功能实现测试 前言 最近写了一个日志系统,需要通过访问的 IP 地址来获取真实的地址,并且存到数据库中,我也是在网上看了一些文章,遂即整理了一下供大家参考。 功能实现 这个是获取正确 IP 地址的方法,可以直...
    99+
    2023-08-16
    java tcp/ip 网络
  • PHP获取客户端及服务器端IP的封装类
    以下是一个封装了获取客户端和服务器端IP的PHP类的示例:```phpclass IPHelper {public static f...
    99+
    2023-08-29
    PHP
  • Java中Socket如何实现Redis客户端
    小编给大家分享一下Java中Socket如何实现Redis客户端,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Redis是最常见的缓存服务中间件,在java开发中,一般使用 jedis 来实现。Redis的命令协议:$参数...
    99+
    2023-06-15
  • 如何获取cdn加速后的真实ip
    获取cdn加速后真实ip的方法ping二级域名很多网站不会给二级域名做CDN服务,因此可以通过ping网站的二级域名,实现获取真实ip。反向查找通过让服务器向主动向你推送消息,如邮件等;从而得到真实ip。...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作