1. 程式人生 > >Java獲取客戶端真實IP地址

Java獲取客戶端真實IP地址

1、我們一般在程式開發時,總會用到這種獲取訪問者IP的功能,以便記錄客戶端的登入和訪問行為。一般情況下,我們可以使用 requestgetRemoteAddr() 方法獲取客戶端實際 IP ,但是 Nginx 使用反向代理後,我們使用 getRemoteAddr() 是無法獲取真實的 IP 的。

2、經過代理之後,客戶端和服務端之間加了一箇中間層,在轉發請求的HTTP頭部增加了 x-forwarded-for 資訊,以跟蹤原來的客戶端IP地址和原來客戶端請求的伺服器地址。

3、當我們去訪問頁面時,先由代理伺服器去訪問伺服器的地址和檔案,代理伺服器再講訪問結果返回給我們的瀏覽器,所以直接和伺服器打交道的是代理伺服器,所以我們使用 request.getRemoteAddr()

方法獲取到的也只是帶伺服器的地址。這種情況下我們可以用 request.getHeader(“x-forwarded-for”) 的方法去獲取真實的IP地址。但是在squid.conf 的配製檔案中,forwarded_for 項預設是為on 可以獲取到,如果 forwarded_for 設成了 off x-forwarded-for 就會返回 unknown,所以我們可以這樣寫:

public String getRemortIP(HttpServletRequest request) {
    String ip = request.getHeader("x-forwarded-for"
); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0
|| "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; }

大功告成!