获取客户端真实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. Java 将Html转为PDF

    本文介绍如何在Java程序中将html文件转换成PDF文件.转换时,需要注意以下两点: 一.需要使用转换插件 可根据不同的系统来下载对应的插件,下载地址:windows-x86.zip, window ...

  2. 注册github时总卡在第一步无法验证的解决办法

    从github官网可以看出问题所在,所以造成这一问题的极大可能就是浏览器的问题. 最简单的方法就是换手机浏览器进行注册

  3. element UI dialog 固定高度 且关闭时清空数据

    解决方法:在dialog里写一个div ,div的大小设置为相对视窗的大小就行 <el-dialog title="xxx" :visible.sync="dial ...

  4. Tomcat之如何自己做一个tomcat

    来源:<How Tomcat Works> Servlet容器的工作原理: 1.创建一个request对象并填充那些有可能被所引用的servlet使用的信息,比如参数.头部.cookies ...

  5. WinMTR 网络测试工具-九五小庞

    WinMTR(建议优先使用) 百度下载工具 链接:https://pan.baidu.com/s/19ArKSTA2amsa4p6vHegDIQ 提取码:cy4y WinMTR是mtr工具在Windo ...

  6. Redis安装问题解决方案

    Redis部署采坑记   Redis部署采坑记 问题一: 问题描述: make 编译源码时报错 问题详解: 因为缺少gcc-c++编译器的原因 解决方案: 方案一: yum -y install gc ...

  7. 转载:MySQL万字总结篇

    转载自:https://database.51cto.com/art/202001/609409.htm 开局一张图 这张图是重点!!!咱要先对 MySQL 有一个宏观的了解,知道他的执行流程. 一条 ...

  8. Windows+Git+TortoiseGit+COPSSH安装图文教程

    http://blog.csdn.net/aaron_luchen/article/details/10498181/ http://jingyan.baidu.com/article/3a2f7c2 ...

  9. go http请求流程分析

    前言 golang作为常驻进程, 请求第三方服务或者资源(http, mysql, redis等)完毕后, 需要手动关闭连接, 否则连接会一直存在; 连接池是用来管理连接的, 请求之前从连接池里获取连 ...

  10. 原生js实现懒加载并节流

    像淘宝网站等,页面中有着大量图片,一次性全部加载这些图片会使浏览器发送大量请求和造成浪费.采用懒加载技术,即用户浏览到哪儿,就加载该处的图片.这样节省网络资源.提升用户体验.减少服务器压力. 方法1: ...