JAVA web中的Controller如何获取客户端的IP地址?我们通常的做法都是通过
HttpServletRequest.getRemoteHost方法,但是这个简单的方法却可能你无法获取到真实的客户端IP。我们都知道HTTP的服务一般都是会躲在一个代理服务器后面的(比如Nginx、Apache以及其他的网关服务等,当然如果应用比较简单,我们也会将web服务直接暴露出去),因此我们通过HttpServletRequest.getRemoteHost获取到的IP地址可能是我们的网关的IP地址。
IP被代理
我们如果想获取客户端真正的IP,就需要http网关的支持。通常情况下我们的HTTP网关会使用apache和ngnix这种软负载,当然也有一些工作在HTTP层的硬件网关。针对硬件网关我们自然是需要和PE交代好,需要硬件层面把客户端真实的IP通过HTTP头传递给我们,一般我们会使用X-Forwarded-For作为默认的真实IP的http header。
而如果这个http网关是由我们自己运维的,那就更简单了。以nginx为例,我们可以通过以下配置将客户端真实IP放到http header中,传给Web服务器:
proxy_set_header X-Forwarded-For $remote_addr;
这样我们的代码就能获取到真实的客户端IP地址:
@GetMApping("/get")
public String getClientIP(HttpServletRequest request) {
String ip1 = request.getHeader("x-forwarded-for");
String ip2 = request.getRemoteHost();
// 以x-forwarded-for为第一优先级
return Stream.of(ip1, ip2).filter(StrUtil::isNotBlank).findFirst().orElse(null);
}
具体代码地址(持续更新哦)
https://gitee.com/slackwareer/tyj-springboot