<返回更多

Java的Controller中无法获取到真正的客户端IP地址问题

2023-11-18  今日头条  天一境
加入收藏

JAVA web中的Controller如何获取客户端的IP地址?我们通常的做法都是通过
HttpServletRequest.getRemoteHost方法,但是这个简单的方法却可能你无法获取到真实的客户端IP。我们都知道HTTP的服务一般都是会躲在一个代理服务器后面的(比如NginxApache以及其他的网关服务等,当然如果应用比较简单,我们也会将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
关键词:Java      点击(2)
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多Java相关>>>