如何在servlet中获取客户端的远程地址?
有没有什么办法可以得到客户端的原始IP地址到服务器? 我可以使用request.getRemoteAddr()
,但我似乎总是得到代理或Web服务器的IP。
我想知道客户端用来连接到我的IP地址。 无论如何,我可以得到它?
尝试这个:
public static String getClientIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; }
request.getRemoteAddr()
就是这样。 它出现你的代理更改源IP。 当一些代理服务器这样做时,他们会在一些自定义的http头文件中添加原始IP 使用request.getHeaderNames()
和request.getHeaders(name)
并打印所有这些文件来查看是否没有任何感兴趣的内容。 就像X-CLIENT-IP
(把它做成一个,但是看起来像这样)
你不能以有意义的方式做到这一点。
代理可能会或可能不会添加一个代理的标题,但在很多情况下,这将是一个内部唯一的地址,所以这对你来说是没有意义的。 在组织边缘的大多数代理被configuration为尽可能less地揭示networking的内部。
你打算如何使用这些信息?
我曾经用过的最好的解决scheme
public String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; }
由于这通常是部署问题,而不是应用程序问题,所以另一种方法是适当地configuration应用程序容器。 configuration完成后,容器会检查相应的头文件,然后应用程序继续使用request.getRemoteAddr()
。
例如,在Tomcat中,您可以使用远程IP阀 。 我假设大多数应用程序服务器具有类似的function
该容器还可以考虑您的前端负载均衡器是否正在终止SSL连接,并通过HTTP将请求转发给应用服务器。 当您的应用程序需要生成自己的URL时,这一点很重要。
String ipAddress = request.getHeader("x-forwarded-for"); if (ipAddress == null) { ipAddress = request.getHeader("X_FORWARDED_FOR"); if (ipAddress == null){ ipAddress = request.getRemoteAddr(); } }
如果使用代理或负载均衡器,“x-forwarded-for”请求标头包含原始客户端IP。 但我想不是所有的代理/ lb都添加了这个头文件。
这里有一些parsing头文件的java代码: http : //www.codereye.com/2010/01/get-real-ip-from-request-in-java.html
如果这个标题不存在,那么我会按照@ Bozho的build议进行
InetAddress inetAddress = InetAddress.getLocalHost(); String ip = inetAddress.getHostAddress();