关于apache:HttpServletRequest.getRemoteAddr()返回错误的地址

HttpServletRequest.getRemoteAddr() returning wrong address

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest)context.getRequest();

this.remoteAddress =  request.getRemoteAddr();

但是,这似乎总是返回我们网络的内部地址,而不是客户端的IP地址。 根据我的研究,似乎在网络中具有反向代理可能会造成混乱,但是我们可以通过重新配置Web服务器来修复它。 还有其他人有这个问题吗,您如何解决呢?

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


您可以"查看"代理,并使用X-FORWARDED-FOR标头获取原始请求者的地址

1
request.getHeader("X-FORWARDED-FOR" );

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

参考:X-FORWARDED-FOR的维基百科描述


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

1
2
3
4
5
    <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"%r" %s %b"%{referer}i""%{user-agent}i""
           resolveHosts="false"/>