2014-02-16 148 views
1

我想在Struts2中获取客户端IP地址。该请求通过Apache Web服务器路由到Tomcat服务器,两台服务器都驻留在同一台物理服务器上。客户端和Apache之间的连接是安全的,但不在Apache和Tomcat之间。当我尝试获取客户端IP地址时,我总是得到127.0.0.1。如何从Apache Web服务器获取Struts2/Servlet中的客户端IP地址?如何在Struts2/Servlet中从Apache Web服务器获取客户端IP地址?

在此先感谢!

回答

2

客户端的IP地址在一个servlet,你可以得到如此 -

HttpServletRequest httpServletRequest = (HttpServletRequest) request; 

// Proxy 
String userIpAddress = httpServletRequest.getHeader("X-Forwarded-For"); 

if(userIpAddress == null) { 
    userIpAddress = request.getRemoteAddr(); 
} 
+0

如果'userIpAddress'不是'null',它是否也包含代理地址?如果是这样,请帮我决定在数据库中存储'userIpAddress'值的最大长度。谢谢! – San

+0

不客气。该标题将包含“真实”IP地址。大多数代理服务器都会发送带有“x-forwarded-for”标头的请求。但是有很多匿名代理服务器,它们不会传递任何额外的头文件。 –

+1

标题中字段的一般格式是:'X-Forwarded-For:client,proxy1,proxy2,...,proxyN',其中值是以逗号+空格分隔的IP地址列表,最左边的是原始客户端以及每个通过请求的后续代理添加接收请求的IP地址。 @Stephen C写道。要获得代理服务器的IP(如果使用),只需使用'getRemoteAddr()'。 –

2

当我试图让客户端IP地址,我总是127.0.0.1。

这是因为,当你看到它在Tomcat的servlet的请求已被(反向)由Apache前端代理,以及Apache < - > Tomcat的流量会在回网络。

解决方法是检查代理添加的头;例如见@阿列克谢的答案。

几件事情要注意:不是由HTTP规范规定

  • 此行为(加入标题代理)的。

  • 不同的代理行为有所不同;例如他们可能会添加不同的标题。

  • 请求可能会经过多个代理。

  • 一般来说,不能保证代理人说的是实话,或者说它会根本揭示信息。

  • “终极”客户端IP地址可能是NAT地址......这意味着您将难以识别真正的客户端。

+0

感谢您的积分,up-voteed。 – San

相关问题