HttpServletRequest.getRemoteAddr()返回错误的地址

时间:2009-11-19 22:36:31

标签: apache jboss servlets

我们需要从Seam操作中记录客户端的IP地址。目前,我们正在使用代码:

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest)context.getRequest();

this.remoteAddress =  request.getRemoteAddr();

然而,这似乎总是返回我们网络的内部地址,而不是客户端的IP地址。根据我的研究,似乎在网络中使用反向代理可能会让事情变得混乱,但我们可以通过重新配置我们的Web服务器来修复它。有没有其他人有这个问题,你是怎么解决的?

我们正在使用JBoss 5.1应用服务器和Apache Web服务器。谢谢!

2 个答案:

答案 0 :(得分:6)

您可以“透过”代理并使用

X-FORWARDED-FOR标题中获取原始请求者的地址
request.getHeader( "X-FORWARDED-FOR" );

我猜原始请求者和您的服务器之间的行为不当代理可能导致真正的价值丢失。

参考:wikipedia description of X-FORWARDED-FOR

答案 1 :(得分:3)

您需要的是反向代理在特殊标头中传递原始IP地址,例如x-forwarded-for。然后,您可以从servlet中检索此标头。此外,您可能希望修改日志文件以记录此IP地址。例如:

    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
           prefix="access_log." suffix=".txt"
           fileDateFormat="yyyy-MM-dd"
           pattern="%{x-forwarded-for}i %l - %t &quot;%r&quot; %s %b &quot;%{referer}i&quot; &quot;%{user-agent}i&quot;"
           resolveHosts="false"/>