我正在用Java编写一个应用程序,该应用程序使用来自底层数据库的数据来提供网页。我基于一些IP限制限制访问网页。基本上,任何属于“已接受”范围的IP都将被允许访问该网页,并且此范围之外的任何IP都将被重定向到错误页面。要获取尝试访问该页面的用户的IP地址,我使用以下内容:
String userIPAddress = request.getRemoteAddr();
'request'是我的HttpServletRequest对象。
我遇到的问题是这个网页是通过Apache Web服务器代理的。
发生这种情况时,它会丢失客户端IP地址并采用我们防火墙的IP地址。因此,当我访问request.getRemoteAddr()时,无论客户是从哪里尝试访问该网页,它都将返回相同的IP。
当通过直接IP地址在内部访问网页时,我的IP检查工作正常。当您通过代理访问时,问题就出现了。
我是否可以通过编程方式访问客户端的实际IP地址?或者这是必须通过Apache Web服务器完成/更改以允许此信息通过的东西?在这种情况下,如果那是一个更好的论坛,我可以发布到服务器故障。
非常感谢您的帮助。
最诚挚的问候。
答案 0 :(得分:2)
当以反向代理模式运行时(例如,使用ProxyPass指令),Apache mod_proxy_http添加了几个请求标头,以便将信息传递给源服务器,其中一个是{{1} }将包含客户端的IP地址。
请记住,如果原始请求已包含此标头(这根本不常见),Apache会将客户端IP地址附加到existig值,因此您将获得逗号+空格分隔的IP地址列表。最后(最右边)的IP地址始终是连接到最后一个代理(您的Apache)的IP地址,这意味着您要对其进行测试。
答案 1 :(得分:0)
我认为不可能以编程方式执行此操作。我不认为甚至可以在Apache Web服务器中进行更改。
听起来好像你的防火墙伪装了传入的IP地址。我认为解决方案在于防火墙的配置。
答案 2 :(得分:0)
您可以在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();