一、通過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-tw/n/184918.html