Java Tomcat-RemoteIpValve-x-forwarded-for标头为空

Java Tomcat-RemoteIpValve-x-forwarded-for标头为空,java,spring,amazon-web-services,tomcat,amazon-elb,Java,Spring,Amazon Web Services,Tomcat,Amazon Elb,我在Tomcat 7(7.0.68)上部署了一个应用程序(JVM 1.8.031-b13、Spring MVC 4.2.4、Security 4.0.3),我正在使用AWS ELB来处理来自客户端的请求。 在我的应用程序中,我尝试使用X-forwarded-for头获取客户端ip地址。如果找不到它,则使用HttpServletRequest类的getRemoteAddr方法。 我在应用程序中记录信息时注意到以下几点: 第一: 标头x-forwarded-for始终为空 第二: 远程地址有时与el

我在Tomcat 7(7.0.68)上部署了一个应用程序(JVM 1.8.031-b13、Spring MVC 4.2.4、Security 4.0.3),我正在使用AWS ELB来处理来自客户端的请求。 在我的应用程序中,我尝试使用X-forwarded-for头获取客户端ip地址。如果找不到它,则使用HttpServletRequest类的getRemoteAddr方法。 我在应用程序中记录信息时注意到以下几点:

第一: 标头x-forwarded-for始终为空

第二: 远程地址有时与elb ip相同,有时与客户端ip地址相同。 我注意到:

  • 当远程地址与客户端ip地址相同时,请求被视为安全的,方案为https(方法isSecure和getScheme)
  • 当远程地址与elb地址ip相同时,则请求不被视为安全的,方案为http(方法isSecure和getScheme)
以下是server.xml中的阀门配置:

<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto" internalProxies="172\.(1[6-9]|2\d|3[0-1])\.\d{1,3}\.\d{1,3}|10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}" />

下面是elb地址ip的示例:172.31.xxx.xxx

我不明白:

  • 为什么x-forwarded-for标头始终为空
  • 以及为什么有些请求被认为是安全的,有些则不是

感谢您的帮助

ELB上的侦听器是如何准确配置的?您是在ELB还是在Tomcat中终止SSL?@MarkB:listeners是这样配置的ELB协议:HTTP/ELB端口:80/实例协议:HTTP/Instance端口8080和ELB协议:HTTPS/ELB端口:443/实例协议:HTTP/Instance端口8080终止是在ELB完成的您确定请求为空吗x-forwarded-for标头不仅仅是ELB健康检查请求?此外,您正在接受来自ELB的HTTP和HTTPS请求,并且您应该只期望HTTPS请求会导致
isSecure==true
。是的,我确定这不是ELB健康检查。关于HTTP和HTTPS,对于我的测试,我只使用HTTPS发出请求。ELB上的侦听器是如何准确配置的?您是在ELB还是在Tomcat中终止SSL?@MarkB:listeners是这样配置的ELB协议:HTTP/ELB端口:80/实例协议:HTTP/Instance端口8080和ELB协议:HTTPS/ELB端口:443/实例协议:HTTP/Instance端口8080终止是在ELB完成的您确定请求为空吗x-forwarded-for标头不仅仅是ELB健康检查请求?此外,您正在接受来自ELB的HTTP和HTTPS请求,并且您应该只期望HTTPS请求会导致
isSecure==true
。是的,我确定这不是ELB健康检查。关于HTTP和HTTPS,对于我的测试,我只使用HTTPS发出请求。