Почему request.getRemoteAddr() возвращает ipv4 или ipv6 в зависимости от контекста (post query или ajax query)
У меня есть веб-приложение с Spring/GWT, которое использует Flash для загрузки файлов.
Когда я отправляю запрос 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-адрес, чтобы быть уверенным, что пользователь может загружать файлы (из-за ошибки при сеансе, потерянного при загрузке со вспышкой), и ip-адрес изменяется, когда я использую ajax или Post через flash.
Какая проблема и как я могу получить тот же формат ip?
спасибо
Ответы
Ответ 1
Причина в том, что имя, которое вы вводите в своем браузере, имеет оба адреса ipv4 и ipv6. Браузер выбирает использовать ipv4, flash выбирает использовать ipv6. Вы ничего не можете сделать с этим на стороне сервера (нет способа конвертировать).
Однако вы можете изменить свой DNS и сделать свое имя только одним адресом, либо ipv4, либо ipv6. Вы также можете подключиться к буквальному IP-адресу (127.0.0.1), а не к имени (localhost).
Ответ 2
Вы можете исправить это, запустив свой сервер с помощью этого флага
-Djava.net.preferIPv4Stack=true
Ответ 3
вы получаете IPv6-адрес, тогда используется IPv6. IPv4 и IPv6 - разные протоколы, и клиент выбирает, какой из них использовать, когда оба доступны.
Если вы хотите адрес клиента IPv4, вы можете заставить их использовать его, не рекламируя IPv6-адрес в DNS. Это было бы плохой идеей, хотя с увеличением развертывания IPv6. Поддержка обоих хороша, поэтому лучше иметь дело с клиентами, использующими IPv6.