一、通過HttpServletRequest獲取
在Java Web開發中,獲取客戶端IP地址的最常用方法是通過HttpServletRequest對象獲取,示例代碼如下:
public String getIpAddress(HttpServletRequest request) {
String ipAddress = request.getHeader("x-forwarded-for");
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
return ipAddress;
}
這段代碼中,首先嘗試從x-forwarded-for、Proxy-Client-IP和WL-Proxy-Client-IP這三個HTTP頭中獲取客戶端IP地址,如果這三個頭都沒有獲取到,則通過request.getRemoteAddr()獲取客戶端IP地址。
二、通過反向代理獲取
在一些情況下,Web應用可能會被反向代理服務器擋在後面,此時,客戶端的請求不會直接傳遞到Web應用,而是先傳遞到反向代理服務器。如果此時仍然使用第一種方法獲取客戶端IP,可能會得到反向代理服務器的IP地址,而不是客戶端的IP地址。
這種情況下,可以在反向代理服務器中設置相關的HTTP頭,告訴Web應用客戶端的真實IP地址,示例代碼如下:
location / {
proxy_pass http://example.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
在這段代碼中,X-Real-IP和X-Forwarded-For這兩個HTTP頭都會被設置,其中X-Real-IP頭會被設置為客戶端的真實IP地址,X-Forwarded-For頭則會被設置為一個由逗號分隔的IP地址列表,其中第一個IP地址是客戶端的IP地址。
三、通過Socket獲取
如果Web應用需要處理非HTTP的協議,例如SMTP、POP3等,那麼就需要通過Socket獲取客戶端IP地址。
示例代碼如下:
Socket socket = new Socket("localhost", 80);
String ipAddress = socket.getInetAddress().getHostAddress();
這段代碼中,通過Socket連接到指定的服務器和端口,然後通過socket.getInetAddress()獲取連接的對端IP地址。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/184918.html
微信掃一掃
支付寶掃一掃