Java 被Apache代理遮挡的HttpServletRequest对象的远程IP地址

Java 被Apache代理遮挡的HttpServletRequest对象的远程IP地址,java,apache,proxy,ip,Java,Apache,Proxy,Ip,我正在用Java编写一个应用程序,它为web页面提供来自底层数据库的数据。我基于一些IP限制限制访问该网页。基本上,任何属于“已接受”范围的IP都将被允许访问网页,并且任何超出此范围的IP都将被重定向到错误页面。要获取试图访问页面的用户的IP地址,我使用以下方法: String userIPAddress = request.getRemoteAddr(); 其中'request'是我的HttpServletRequest对象 我遇到的问题是,此网页正在通过Apache web服务器进行代理

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

String userIPAddress = request.getRemoteAddr();
其中'request'是我的HttpServletRequest对象

我遇到的问题是,此网页正在通过Apache web服务器进行代理

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

当通过直接IP地址在内部访问网页时,我的IP检查工作正常。当您通过代理进行访问时,问题就会出现

我可以通过编程方式访问客户端的实际IP地址吗?或者这是必须通过ApacheWeb服务器来完成/更改的事情,以允许这些信息通过?在这种情况下,我可以张贴到服务器故障,如果这将是一个更好的论坛

非常感谢你的帮助


致以最诚挚的问候。

我认为不可能通过编程实现这一点。我认为甚至不可能改变ApacheWeb服务器中的某些内容


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

我认为不可能通过编程实现这一点。我认为甚至不可能改变ApacheWeb服务器中的某些内容


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

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

显然,这保留了客户端的IP地址。有人知道为什么吗

使用:

而不是:

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

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

显然,这保留了客户端的IP地址。有人知道为什么吗

使用:

而不是:

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

在反向代理模式下(例如,使用ProxyPass指令),Apache会添加几个请求头,以便将信息传递到源服务器,其中一个是
X-Forwarded-for
,其中将包含客户端的IP地址


请记住,如果原始请求已经包含此头(这一点都不奇怪),Apache将把客户端IP地址附加到existig值,这样您将得到以逗号+空格分隔的IP地址列表。最后一个(最右边的)IP地址始终是连接到最后一个代理(您的Apache)的IP地址,这意味着您要对其进行测试

在反向代理模式下(例如使用ProxyPass指令)时,Apache会添加几个请求头,以便将信息传递到源服务器,其中一个是
X-Forwarded-for
,其中将包含客户端的IP地址


请记住,如果原始请求已经包含此头(这一点都不奇怪),Apache将把客户端IP地址附加到existig值,这样您将得到以逗号+空格分隔的IP地址列表。最后一个(最右边的)IP地址始终是连接到最后一个代理(您的Apache)的IP地址,这意味着您要对其进行测试

这是非常有用的信息。将ProxyPass与HTTP一起使用时,是否自动包含X-Forwarded-For标头?或者我需要在Apache中配置一些东西来包含它吗?默认情况下,它应该在那里,只需查看
request.getHeader(“X-FORWARDED-FOR”)
(或者类似的东西,我不是Java专家:))X-FORWARDED-FOR:client,proxy1,proxy2
其中的值是一个以逗号+空格分隔的IP地址列表,最左边是原始客户端,每个通过请求的后续代理都添加了从中接收请求的IP地址。在本例中,请求通过proxy1、proxy2和proxy3传递(未显示在标头中)。proxy3显示为请求的远程地址。这是非常有用的信息。将ProxyPass与HTTP一起使用时,是否自动包含X-Forwarded-For标头?或者我需要在Apache中配置一些东西来包含它吗?默认情况下,它应该在那里,只需查看
request.getHeader(“X-FORWARDED-FOR”)
(或者类似的东西,我不是Java专家:))X-FORWARDED-FOR:client,proxy1,proxy2
其中的值是一个以逗号+空格分隔的IP地址列表,最左边是原始客户端,每个通过请求的后续代理都添加了从中接收请求的IP地址。在本例中,请求通过proxy1、proxy2和proxy3传递(未显示在标头中)。proxy3显示为请求的远程地址。
String userIPAddress = request.getRemoteAddr();