Почему request.getRemoteAddr() возвращает ipv4 или ipv6 в зависимости от контекста (почтовый запрос или запрос ajax)

Я сделал веб-приложение с Spring/GWT, которое использует Flash для загрузки файлов.

Когда я отправляю запрос ajax с помощью GWT и пытаюсь получить IP-адрес пользователя, я получаю адрес ipv4, например: 127.0.0.1.

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

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

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

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

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

Благодарность


person Jerome Cance    schedule 25.06.2010    source источник
comment
Вы не можете контролировать, какой IP-адрес использует пользователь, вместо этого попробуйте файлы cookie.   -  person Michael Hampton    schedule 02.12.2014


Ответы (3)


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

-Djava.net.preferIPv4Stack=true
person Ted Bigham    schedule 21.02.2014
comment
Я изменил свой принятый ответ 8 лет спустя. Потому что это, кажется, помогает людям больше;) - person Jerome Cance; 10.07.2018

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

person unbeli    schedule 25.06.2010
comment
Итак, как я могу идентифицировать пользователя? Не спрашивая его, чтобы изменить различные настройки. - person Jerome Cance; 25.06.2010
comment
какое имя хоста вы (клиент) используете? Это локальный хост? Это настоящее имя хоста? - person unbeli; 25.06.2010
comment
localhost (для меня при отладке) и реальное имя хоста (настоящий клиент) - person Jerome Cance; 25.06.2010
comment
хорошо, для ваших тестов попробуйте использовать 127.0.0.1 вместо localhost. Для клиентов убедитесь, что ваше реальное имя хоста имеет адрес IPv4 или IPv6, а не оба. - person unbeli; 25.06.2010
comment
@Александр Погребняк, разве он не всегда там? - person unbeli; 25.06.2010
comment
@unbeli. Так оно и есть, но если вы никогда об этом не слышали, то это не первое место, куда я бы заглядывал. - person Alexander Pogrebnyak; 25.06.2010

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

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

person vikash kumar    schedule 01.12.2014