获取客户端真实IP
ServletRequest接口提供了getRemoteAddr方法用于获取客户端IP,但是当客户端通过代理服务器访问后端服务器的时候,服务器调用getRemoteAddr方法会返回最近的代理服务器的IP而非客户端真实IP。这种情况下通常是使用X-Forwarded-For请求头来获取客户端真实IP。
X-Forwarded-For简称XFF头,它保存了客户端和各级代理服务器的IP,只有在通过了HTTP正向代理服务器或者反向代理服务器时才会添加该项,一般格式如下:X-Forwarded-For: client1, proxy1, proxy2。基本流程是,当client1发出请求且请求没有经过任何的代理服务器,那么此时没有X-Forwarded-For;当请求经过proxy1的时候,proxy1将client1的IP添加到X-Forwarded-For中,此时X-Forwarded-For: client1;当请求经过proxy2的时候,proxy2将proxy1的IP添加到X-Forwarded-For中,此时X-Forwarded-For: client1, proxy1,以此类推。它在正向代理软件(如Squid)和反向代理软件(如Nginx)中都是标准用法。
X-Real-IP没有相关的标准,可以在代理中配置这个请求头的值为客户端真实IP,但是还是推荐使用X-Forwarded-For,因为Nginx一般配置X-Real-IP为$remote_addr,如果经过多级代理,就无法拿到客户端真实IP了。
以Nginx反向代理为例,Nginx里配置如下:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
proxy_set_header指令用于设置HTTP请求头,$remote_addr变量表示客户端IP,$proxy_add_x_forwarded_for变量表示客户端HTTP请求头中的X-Forwarded-For再加上“,”和$remote_addr。
在Tomcat中可以使用如下代码获取客户端真实IP:
String ip = request.getHeader("x-forwarded-for");
if (ip != null && ip.length() != 0) {
if (ip.indexOf(",") != -1) {
ip = ip.split(",")[0];
}
}
 
获取真实请求协议
一般情况下,反向代理服务器请求后端服务器时是采用http协议,而客户端访问反向代理服务器时是采用https协议,这种情况下,后端服务器302重定向到某个相对路径时会读取到请求的协议为http,导致Location响应头指中的URL的协议为http,重定向失败。
Tomcat的org.apache.catalina.valves.RemoteIpValve可以用来解决上述问题。
以Nginx反向代理为例,Nginx里配置如下:
proxy_set_header X-Forwarded-Proto $scheme
$scheme表示请求协议,值为http或https。
Tomcat配置如下:
<Host name="localhost" appBase=......>
<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto" />
<Context path="/" docBase=....../>
</Host>

Tomcat 8.5中获取客户端真实IP及协议的更多相关文章

  1. Kubernets中获取客户端真实IP总结

    1. 导言 绝大多数业务场景都是需要知道客户端IP的 在k8s中运行的业务项目,如何获取到客户端真实IP? 本文总结了通行的2种方式 要答案的直接看方式一.方式二和总结 SEO 关键字 nginx i ...

  2. Nginx反向代理后应用程序获取客户端真实IP

    Nginx反向代理后,Servlet应用通过request.getRemoteAddr()取到的IP是Nginx的IP地址,并非客户端真实IP,通过request.getRequestURL()获取的 ...

  3. Java Web 获取客户端真实IP

    Java Web 获取客户端真实IP 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP.一般分为两种情况: 方 ...

  4. 获取客户端真实IP地址

    Java-Web获取客户端真实IP: 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP. 一般分为两种情况: ...

  5. nginx 代理模式下,获取客户端真实IP

    最近做博友推荐,发现个小问题,用$_SERVER['REMOTE_ADDR'];得到的都是服务器的地址192.168.96.52,搜索了一下,发现问题,改为$_SERVER['HTTP_X_REAL_ ...

  6. Java 获取客户端真实IP地址

    本文基于方法 HttpServletRequest.getHeader 和 HttpServletRequest.getRemoteAddr 介绍如何在服务器端获取客户端真实IP地址. 业务背景 服务 ...

  7. 伪造IP及获取客户端真实IP地址

    Fiddler支持自定义规则,可以实现对HTTP请求数据发送给Server前或HTTP应答数据发送给浏览器前进行修改.下面的例子将演示如何向所有HTTP请求数据中增加一个头.1)打开Fiddler,点 ...

  8. 获取客户端真实ip

    // 获取客户端真实ip() protected function getIP() { global $ip; if (getenv("HTTP_CLIENT_IP")) $ip ...

  9. 某云负载均衡获取客户端真实IP的问题

    某云负载均衡真实IP的问题,我们这边已经遇到过两次了.而且每次和售后沟通的时候都大费周折,主要是要给售后说明白目前文档的获取真实IP是有问题的,他们觉得文档上说明的肯定没问题,售后要是不明白,他们不会 ...

随机推荐

  1. CentOS 7/8上部署Ceph

    Ceph是一个分布式的存储系统,可以在统一的系统中提供唯一的对象.块和文件存储,Ceph的大致组件如下: 1. Ceph监视器(ceph-mon):用来维护集群状态的映射,包括监视器映射,管理器映射, ...

  2. Alink漫谈(二十) :卡方检验源码解析

    Alink漫谈(二十) :卡方检验源码解析 目录 Alink漫谈(二十) :卡方检验源码解析 0x00 摘要 0x01 背景概念 1.1 假设检验 1.2 H0和H1是什么? 1.3 P值 (P-va ...

  3. .Net 单元测试框架xUnit使用

    使用前需要导入下面的NuGet包:(不然可能会导致测试代码无法运行) .net版本 .net core3.1 Moq这个包只有需要Mock的时候才需要导入(不清楚Mock的话可以留言或自行百度) 开始 ...

  4. Spring Boot 通过CORS实现跨域

    同源策略 很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的,说到跨域,就不得不说说浏览器的同源策略. 同源策略是由 Netscape 提出的一个著名的安全策略,它是浏览器最核心也 ...

  5. sublime Text 3安装 Sublime Package Control(这个可以用于安装各种插件)时显示默认安装的c盘内存不够的解决方案

    首先先关闭st3 之后在安装的路径下创建Data文件夹,然后打开st3(sublime Text 3简写)CTRL+`打开命令行输入以下内容,直接回车,等待下载完成就可以了import urllib. ...

  6. 关于bat批处理的一些操作,如启动jar 关闭进程等

    先说一下学习这个的前提: 公司要写个生成uid的工具,整完了之后就又整批处理工具,出于此目的,也是为了丰富自己的知识,就学习了一下,下面是相关的批处理脚本 我花了半天的时间找了相关的bat批处理,但是 ...

  7. facebookPixel代码安装详解

    最近接到一个需求,优化独立站的facebookPixel代码,完成后对这个项目进行复盘.首先要介绍facebookPixel的理论知识. Facebook像素是一段JavaScript代码,其中加载了 ...

  8. Java HashMap源码

    http://blog.csdn.net/qq_27093465/article/details/52207135 http://blog.csdn.net/qq_27093465/article/d ...

  9. 什么是Nginx -九五小庞

  10. TonWeb6.1Linux安装文档

    东方通部署文档   东方通安装部署文档 准备文件:开始安装:警告:在安装之前先安装JDK,JDK要求JDK5以上Linux安装:运行安装包sh Install_TW6.1.5.15_Standard_ ...