2009-11-19 19 views
8

È necessario registrare l'indirizzo IP del client da un'azione Seam. Attualmente, stiamo usando il codice:HttpServletRequest.getRemoteAddr() restituisce l'indirizzo errato

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext(); 
HttpServletRequest request = (HttpServletRequest)context.getRequest(); 

this.remoteAddress = request.getRemoteAddr(); 

Tuttavia, questo sembra essere sempre la restituzione di un indirizzo interno della nostra rete, piuttosto che l'indirizzo IP del client. Dalla mia ricerca, sembra che avere un proxy inverso nella rete possa confondere le cose, ma potremmo essere in grado di risolverlo riconfigurando i nostri server web. Qualcun altro ha avuto questo problema e come lo hai risolto?

Utilizziamo server di app JBoss 5.1 e server Web Apache. Grazie!

risposta

6

Si può 'vedere attraverso' un proxy e ottenere l'indirizzo del richiedente originale dalla testata X-FORWARDED-FOR utilizzando

request.getHeader("X-FORWARDED-FOR"); 

immagino un proxy comportamento anomalo tra il richiedente originale e il server potrebbe causare il vero valore essersi persi.

Rif: wikipedia description of X-FORWARDED-FOR

+0

Questo aiuterà per un proxy HTTP, ma non tanto per un firewall NAT. – bmargulies

+0

Grazie che è una buona informazione, ma cosa potrebbe fare un proxy comportarsi male? La mia comprensione è che se tutto è configurato correttamente, request.getRemoteAddr() dovrebbe guardare comunque l'intestazione "x_forwarded_for", e se non è impostato correttamente, quell'intestazione potrebbe anche non esserci. –

3

Quello che vi serve è per il vostro proxy inverso per passare l'indirizzo IP originale in un'intestazione speciale, come x-forwarded-for. È quindi possibile recuperare questa intestazione dal proprio servlet. Inoltre, è possibile modificare il file di registro per registrare questo indirizzo IP. Esempio:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
      prefix="access_log." suffix=".txt" 
      fileDateFormat="yyyy-MM-dd" 
      pattern="%{x-forwarded-for}i %l - %t &quot;%r&quot; %s %b &quot;%{referer}i&quot; &quot;%{user-agent}i&quot;" 
      resolveHosts="false"/> 
Problemi correlati