2010-06-25 3 views
13

У меня есть веб-приложение с Spring/GWT, которое использует Flash для загрузки файлов.Почему request.getRemoteAddr() возвращает ipv4 или ipv6 в зависимости от контекста (post query или ajax query)

Когда я посылаю запрос Ajax с GWT и попытаться получить адрес пользователя IP, я получаю ipv4 адрес как: 127.0.0.1

, но когда я загрузить мои файлы со вспышкой (и поэтому запрос сообщению то же самое WebApp) я получаю адрес iPv6 0: 0: 0: 0: 0: 0: 0: 1

Я использую тот же код, чтобы получить IP-адрес пользователя, который:

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

проблема заключается в том, что я использую подпись, которая использует ip-адрес, чтобы быть уверенным, что пользователь может загружать файлы (из-за ошибки с потерянной сессией, когда uploa ding со вспышкой), и ip-адрес изменяется, когда я использую ajax или Post через flash.

В чем проблема и как получить такой же формат ip?

благодаря

+0

Вы не можете контролировать, какой IP-адрес использует пользователь, вместо этого попробуйте файлы cookie. –

ответ

11

Причина заключается в том, что имя, которое вы вводите в браузере есть и адреса IPv4 и IPv6. Браузер выбирает использовать ipv4, flash выбирает использовать ipv6. Вы ничего не можете сделать с этим на стороне сервера (нет способа конвертировать).
Однако вы можете изменить свой DNS и сделать свое имя только одним адресом, либо ipv4, либо ipv6. Вы также можете подключиться к буквальному IP-адресу (127.0.0.1), а не к имени (localhost).

+2

Итак, как я могу определить пользователя? Не прося его менять разные настройки. –

+0

Какое имя хоста вы используете (клиент)? Это локальный хост? Это настоящее имя хоста? – unbeli

+0

localhost (для меня, когда я отлаживаю) и реальное имя хоста (реальный клиент) –

31

Вы можете это исправить, запустив сервер с этим флагом

-Djava.net.preferIPv4Stack=true 
+0

Это сделало трюк для меня – RJo

+0

Это работает для меня. –

0

вы получите адрес IPv6, то в настоящее время используется IPv6. IPv4 и IPv6 - это разные протоколы, и клиент выбирает, какой из них использовать, когда оба доступны.

Если вы хотите адрес IPv4 клиента, вы можете заставить их использовать его, не рекламируя IPv6-адрес в DNS. Это было бы плохой идеей, хотя с увеличением развертывания IPv6. Поддержка обоих хороша, поэтому лучше иметь дело с клиентами, использующими IPv6.