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為第一優(yōu)先級
return Stream.of(ip1, ip2).filter(StrUtil::isNotBlank).findFirst().orElse(null);
}
具體代碼地址(持續(xù)更新哦)
https://gitee.com/slackwareer/tyj-springboot