2010-06-25 9 views
13

Ho un'app Web con Spring/GWT che utilizza Flash per caricare file.Perché request.getRemoteAddr() restituisce ipv4 o ipv6 in base al contesto (query post o query ajax)

Quando invio una richiesta AJAX con GWT e cercare di ottenere l'indirizzo IP dell'utente, ottengo un indirizzo IPv4 come: 127.0.0.1

ma quando caricano i file con il flash (e quindi una richiesta di post su lo stesso webapp) ottengo un indirizzo IPv6 0: 0: 0: 0: 0: 0: 0: 1

io uso lo stesso codice per ottenere l'IP dell'utente che è:

ServletRequestAttributes att = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); 
att.getRequest().getRemoteAddr(); 

il problema è che io uso una firma che usa l'indirizzo ip per essere sicuro che l'utente possa caricare i file (a causa di un bug con la sessione persa durante l'uploa ding with flash) e l'indirizzo IP cambia quando uso ajax o Post tramite flash.

Qual è il problema e come posso ottenere lo stesso formato IP?

grazie

+0

Non è possibile controllare quale indirizzo IP viene utilizzato dall'utente, provare invece i cookie. –

risposta

11

La ragione è che il nome digitato nel tuo browser ha entrambi gli indirizzi IPv4 e IPv6. Il browser sceglie di usare ipv4, flash sceglie di usare ipv6. Non c'è niente da fare sul lato server (non c'è modo di convertire).
Tuttavia, è possibile modificare il DNS e rendere il proprio nome un solo indirizzo, ipv4 o ipv6. È inoltre possibile connettersi con un indirizzo IP letterale (127.0.0.1), non un nome (localhost).

+2

Quindi, come posso identificare l'utente? Senza chiedergli di cambiare varie impostazioni. –

+0

come si usa il nome host (client)? È localhost? È vero nome host? – unbeli

+0

localhost (per me quando eseguo il debug) e vero nome host (client reale) –

31

È possibile risolvere il problema avviando il server con questo flag

-Djava.net.preferIPv4Stack=true 
+0

Questo ha fatto il trucco per me – RJo

+0

Questo funziona per me. –

0

si ottiene un indirizzo IPv6 poi IPv6 viene utilizzato. IPv4 e IPv6 sono protocolli diversi e il client sceglie quale utilizzare quando entrambi sono disponibili.

Se si desidera l'indirizzo IPv4 del client, è possibile costringerlo a utilizzarlo non pubblicizzando l'indirizzo IPv6 in DNS. Sarebbe una cattiva idea, tuttavia, con la crescente diffusione di IPv6. Il supporto di entrambi è buono, quindi è meglio trattare con i client che utilizzano IPv6.