2012-09-07 157 views
19

我已經使用JSF 2.0創建了Web應用程序。我在託管站點託管了託管站點,託管站點的服務器位於美國。查找用戶的IP地址

我的客戶想要所有訪問該網站的用戶的詳細信息。我如何在JSF中找到用戶的IP地址?

我試着用

try { 
     InetAddress thisIp = InetAddress.getLocalHost(); 
     System.out.println("My IP is " + thisIp.getLocalHost().getHostAddress()); 
    } catch (Exception e) { 
     System.out.println("exception in up addresss"); 
    } 

但是這給了我我的網站只即服務器IP地址的IP地址。

有人能告訴我如何獲得使用Java訪問網站的IP地址嗎?

+2

您正在使用的方法是可行的方法,但它會找出應用程序正在運行的IP,而不是用戶。 – Addicted

+0

@Addicted:我知道...我提到那個問題... –

回答

52

HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
String ipAddress = request.getHeader("X-FORWARDED-FOR"); 
if (ipAddress == null) { 
    ipAddress = request.getRemoteAddr(); 
} 
System.out.println("ipAddress:" + ipAddress); 
+7

'X-Forwarded-For'頭在逗號分隔格式。如果有的話,你應該只對第一部分感興趣。 – BalusC

+0

代理服務器是否包含多個服務器? *原因:*我使用10.11.101.33作爲代理,我的IP爲10.11.33.102,此代碼返回我10.11.101.31。 33是否首先提供31個要求?在沒有代理的情況下工作正常 – Sarz

+0

由於您依賴於FacesContext = *( –

4

嘗試......

HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
String ip = httpServletRequest.getRemoteAddr(); 
+8

如果客戶端(或服務器)使用代理,則會失敗。 – BalusC

+1

@BalusC X-Forwarded-For(XFF)HTTP標頭是通過HTTP代理Wiki識別連接到Web服務器的客戶端的始發IP地址的事實標準, 但是,如果請求直接來自客戶端,它可以返回null。還有一點是,不能保證代理服務器會爲你傳遞該標題。因此,頭部爲空的事實並不一定意味着getRemoteAddr返回的IP是發出原始請求的計算機的實際IP。它可能仍然是代理服務器的IP。 –

+4

我知道。你還沒有解決你的答案。順便說一句,你爲什麼不用你自己的話?引用消息來源而不是假裝自己的話。另請參閱SO上的cc-wiki許可證。 – BalusC

6

一個更通用的解決方案徑自

接受的答案的改進版本,即使有多的作品 IP地址在X-Forwarded-For標頭:

/** 
* Gets the remote address from a HttpServletRequest object. It prefers the 
* `X-Forwarded-For` header, as this is the recommended way to do it (user 
* may be behind one or more proxies). 
* 
* Taken from https://stackoverflow.com/a/38468051/778272 
* 
* @param request - the request object where to get the remote address from 
* @return a string corresponding to the IP address of the remote machine 
*/ 
public static String getRemoteAddress(HttpServletRequest request) { 
    String ipAddress = request.getHeader("X-FORWARDED-FOR"); 
    if (ipAddress != null) { 
     // cares only about the first IP if there is a list 
     ipAddress = ipAddress.replaceFirst(",.*", ""); 
    } else { 
     ipAddress = request.getRemoteAddr(); 
    } 
    return ipAddress; 
}