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服务器。 谢谢!
您可以"查看"代理,并使用
1 | request.getHeader("X-FORWARDED-FOR" ); |
我猜原始请求者和您的服务器之间的代理行为不当可能会导致真实值丢失。
参考:
您需要的是让反向代理在特殊的标头(例如
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"/> |