2012-09-07 11 views
19

Ho creato un'applicazione Web utilizzando JSF 2.0. L'ho ospitato sul sito di hosting e il server del sito di hosting ha sede negli Stati Uniti.Ricerca dell'indirizzo IP dell'utente

Il mio cliente desidera i dettagli dell'utente che ha effettuato l'accesso al sito. Come posso trovare l'indirizzo IP dell'utente in JSF?

ho provato con

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

tuttavia questo mi dà l'indirizzo IP del mio sito solo cioè server di indirizzo IP.

Qualcuno potrebbe dirmi come ottenere l'indirizzo IP che ha avuto accesso al sito Web utilizzando Java?

+2

Il metodo che si sta utilizzando, è funzionante, ma verrà rilevato l'IP in cui è in esecuzione l'applicazione, ma non dell'utente. – Addicted

+0

@Addicted: So che ... Ho menzionato quello in questione ... –

risposta

52

sono andato avanti con

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

L'intestazione 'X-Forwarded-For' è in ordine separato formato. Dovresti essere interessato solo alla prima parte, se ce ne sono. – BalusC

+0

Il proxy include più di 1 server? * motivo: * Sto usando 10.11.101.33 come proxy e il mio IP è 10.11.33.102 e questo codice mi restituisce 10.11.101.31. Il 33 serve prima 31 richieste? Funziona bene anche se senza proxy – Sarz

+0

Non molto adatto per i test poiché si dipende da FacesContext = * ( –

4

Prova questo ...

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

Questo fallisce se il client (o il server) utilizza un proxy. – BalusC

+1

@BalusC L'intestazione HTTP X-Forwarded-For (XFF) è uno standard di fatto per l'identificazione dell'indirizzo IP di origine di un client che si connette a un server Web tramite un proxy HTTP Wiki, Ma se la richiesta proviene direttamente dal client allora può restituire null. Un altro punto è che non c'è alcuna garanzia che il server proxy passi quell'intestazione per te. Quindi, il fatto che l'intestazione sia nullo, non significa necessariamente che l'IP restituito da getRemoteAddr sia l'effettivo IP della macchina che ha effettuato la richiesta originale. Potrebbe ancora essere l'IP di un server proxy. –

+4

Lo so. Non hai ancora risolto la tua risposta basandoti su quello. A proposito, perché non usi le tue stesse parole? Cita le fonti invece di fingere come se fossero le tue stesse parole. Vedi anche la licenza cc-wiki qui su SO. – BalusC

6

Una soluzione più versatile

Versione migliorata della risposta accettato che funziona anche se ci sono molteplici Indirizzi IP nell'intestazione 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; 
}