我正在尝试在Struts2中获取客户端IP地址。请求通过Apache Web服务器路由到Tomcat服务器,两个服务器都驻留在同一物理服务器上。客户端和Apache之间的连接是安全的,但不是Apache和Tomcat之间的连接。当我尝试获取客户端IP地址时,我总是得到127.0.0.1。如何从Apache Web服务器获取Struts2 / Servlet中的客户端IP地址?
提前致谢!
答案 0 :(得分:2)
您可以获得的servlet中客户端的IP地址 -
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
// Proxy
String userIpAddress = httpServletRequest.getHeader("X-Forwarded-For");
if(userIpAddress == null) {
userIpAddress = request.getRemoteAddr();
}
答案 1 :(得分:2)
当我尝试获取客户端IP地址时,我总是得到127.0.0.1。
这是因为当您在Tomcat中的servlet中看到它时,请求已被Apache前端(反向)代理,而Apache< - > Tomcat流量正在越过环回网络。
解决方案是检查代理添加的标头;例如见@ Alexey的回答。
有几点需要注意:
HTTP规范未指定此行为(代理添加标头)。
不同的代理行为不同;例如他们可能会添加不同的标题。
请求可能会经过多个代理。
一般情况下,无法保证代理人说实话,或者根本不会透露信息。
“终极”客户端IP地址可能是NAT地址......这意味着您将难以识别真正的客户端。