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

Apache HttpServletRequest.getRemoteAddr()返回错误地址,apache,jboss,servlets,Apache,Jboss,Servlets,我们需要从Seam操作中记录客户端的IP地址。目前,我们正在使用以下代码: ExternalContext context = FacesContext.getCurrentInstance().getExternalContext(); HttpServletRequest request = (HttpServletRequest)context.getRequest(); this.remoteAddress = request.getRemoteAddr(); 然而,这似乎总是返回

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

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

this.remoteAddress =  request.getRemoteAddr();
然而,这似乎总是返回我们网络的内部地址,而不是客户端的IP地址。根据我的研究,在网络中使用反向代理似乎会让事情变得混乱,但我们可以通过重新配置web服务器来解决这个问题。还有其他人有这个问题吗?你是如何解决的


我们正在使用JBoss5.1应用服务器和Apache web服务器。谢谢

您可以“看穿”代理,并使用

request.getHeader( "X-FORWARDED-FOR" );
我猜,原始请求者和服务器之间的代理行为不当可能会导致真正的值丢失


Ref:

您需要的是反向代理在一个特殊的头中传递原始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"/>


这对HTTP代理有帮助,但对NAT防火墙没有那么大帮助。谢谢,这是一个好信息,但是什么会使代理行为不正常呢?我的理解是,如果所有配置都正确,那么request.getRemoteAddr()无论如何都应该查看“x_forwarded_for”头,如果设置不正确,该头甚至可能不在那里。