2010-06-25 7 views
13

J'ai créé une application web avec Spring/GWT qui utilise Flash pour télécharger des fichiers.Pourquoi request.getRemoteAddr() renvoie ipv4 ou ipv6 en fonction du contexte (post-requête ou requête ajax)

Lorsque j'envoie une demande de paiement ajax avec GWT et essayer d'obtenir l'adresse IP de l'utilisateur, je reçois une adresse ipv4 comme: 127.0.0.1

mais quand je télécharge mes fichiers avec flash (et donc une demande de poste sur même webapp) Je reçois une adresse ipv6 0: 0: 0: 0: 0: 0: 0: 1

J'utilise le même code pour obtenir l'adresse IP de l'utilisateur qui est:

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

le problème est que j'utilise une signature qui utilise l'adresse IP pour être sûr que l'utilisateur peut télécharger des fichiers (en raison d'un bug avec la session perdue quand uploa ding with flash) et l'adresse IP change lorsque j'utilise ajax ou Post via flash.

Quel est le problème et comment puis-je obtenir le même format ip?

grâce

+0

Vous ne pouvez pas contrôler l'adresse IP que l'utilisateur utilise, essayez plutôt les cookies. –

Répondre

11

La raison est que le nom que vous tapez dans votre navigateur a deux adresses IPv4 et IPv6. Le navigateur choisit d'utiliser ipv4, flash choisit d'utiliser ipv6. Il n'y a rien que vous pouvez faire à ce sujet sur le côté serveur (il n'y a aucun moyen de convertir).
Cependant, vous pouvez changer votre DNS et faire que votre nom ait une seule adresse, ipv4 ou ipv6. Vous pouvez également vous connecter avec une adresse IP littérale (127.0.0.1), pas un nom (localhost).

+2

Alors, comment puis-je identifier l'utilisateur? Sans lui demander de changer les différents paramètres. –

+0

Quel est le nom d'hôte que vous (client) utilise? Est-ce localhost? Est-ce vrai nom d'hôte? – unbeli

+0

localhost (pour moi lorsque je débogue) et nom d'hôte réel (vrai client) –

31

Vous pouvez le réparer en démarrant votre serveur avec ce drapeau

-Djava.net.preferIPv4Stack=true 
+0

Cela a fait l'affaire pour moi – RJo

+0

Cela fonctionne pour moi. –

0

vous obtenez une adresse IPv6 alors IPv6 est utilisé. IPv4 et IPv6 sont des protocoles différents, et le client choisit lequel utiliser quand les deux sont disponibles.

Si vous voulez l'adresse IPv4 du client, vous pouvez l'obliger à l'utiliser en ne publiant pas l'adresse IPv6 dans DNS. Ce serait une mauvaise idée avec le déploiement croissant d'IPv6. Soutenir les deux est bon, il est donc préférable de traiter avec les clients utilisant IPv6.

Questions connexes