HttpServletRequest对象的远程IP地址被Apache Proxy遮挡

我正在用Java编写一个应用程序,它使用来自底层数据库的数据为网页提供服务。 我基于一些IP限制来限制对网页的访问。 基本上任何属于“接受”范围的IP都将被允许访问网页,任何超出此范围的IP将被redirect到错误页面。 要获取尝试访问该页面的用户的IP地址,我正在使用以下内容:

String userIPAddress = request.getRemoteAddr(); 

“请求”是我的HttpServletRequest对象。

我遇到的问题是这个网页是通过Apache Web服务器代理的。

发生这种情况时,会丢失客户端IP地址并采用防火墙的IP地址。 因此,当我访问request.getRemoteAddr()时,无论客户尝试访问网页的位置,它都会返回相同的IP。

当通过直接IP地址在内部访问网页时,我的IP检查工作得很好。 当您通过代理访问时,问题就出现了。

有什么我可以以编程方式访问客户端的实际IP地址? 或者,这是必须通过Apache Web服务器完成/更改以允许此信息通过? 在这种情况下,我可以发布到服务器故障,如果这将是一个更好的论坛。

非常感谢您的帮助。

最好的祝福。

以反向代理模式(例如,使用ProxyPass指令)进行操作时,Apache mod_proxy_http会添加多个请求标头,以便将信息传递到原始服务器,其中之一是X-Forwarded-For ,其中包含IP地址的客户。

请记住,如果原始请求已经包含了这个头文件(这根本就不常见),Apache会将客户端的IP地址附加到存在的值上,这样你将得到以逗号+空格分隔的IP地址列表。 最后一个(最右边的)IP地址始终是连接到最后一个代理(您的Apache)的IP地址,这意味着您要对其进行测试。

我不认为有可能以编程方式做到这一点。 我不认为甚至有可能改变Apache Web服务器中的某些东西。

听起来像你的防火墙伪装传入的IP地址。 我认为解决方案是在你的防火墙的配置。

您可以在Apache代理中使用AJP协议而不是HTTP。

显然这保留了客户端的IP地址。 有没有人有任何想法,为什么?

使用:

 ProxyPass /APPLICATION_NAME ajp://IP_ADDRESS:8009/APPLICATION_NAME 

代替:

 <Location "/APPLICATION_NAME"> ProxyPass http://IP_ADDRESS:8080/APPLICATION_NAME ProxyPassReverse http://IP_ADDRESS:8080/APPLICATION_NAME </Location> 

在.conf代理文件中。

这使我能够从客户端获取IP,而不会在代理期间被覆盖。 我也不必更改任何代码。 在Apache代理文件中更改为AJP后,以下内容包含正确的IP地址:

 String userIPAddress = request.getRemoteAddr();