request如何获取客户端IP地址

Fri May 15 19:05:27 CST 2015 918 Web

文章摘要进行java web开发的有些时候,需要获得浏览器端(客户端)主机的IP地址,但是有些托管服务器使用了反向代理服务器,导致request.getRemoteAddr()方法获取到的是127.0.0.1而不是真实的客户主机IP地址。

java servlet里的HttpServletRequest类为我们提供了一个了一个getRemoteAddr()方法来获取客户端IP地址,但是这个方法在实际的开发环境中,并不是经常有效的,因为如果web应用部署的服务器使用了反向代理服务器,那么request.getRemoteAddr()方法返回的会是反向代理服务器的IP地址。但是反向代理服务器在给HTTP请求转发到实际的web服务器时,会在请求的header信息中增加X-FORWARDED-FOR字段,用以跟踪客户端实际IP地址。

于是如果使用反向代理服务器的话,我们可以使用下面一个语句来获取真实的客户端IP地址

String ip = request.getHeader("x-forwarded-for");

如果在进行开发时并不能确定将来线上环境是否使用反向代理服务器的话,可以这么写

public String getRemoteIP(HttpServletRequest request) {
    if (request.getHeader("x-forwarded-for") == null) {
        return request.getRemoteAddr();
    }
    return request.getHeader("x-forwarded-for");
}

如果使用了多级反向代理服务器的话,x-forwarded-for字段会包含多个IP地址,其中第一个IP地址就是真实的客户端IP地址。

打赏
打赏

分享到: