Почему HttpServletRequest.getRemoteAddr () не работает в сервлете Java?

Я разрабатываю веб-приложение с Java-сервлетом, я надеюсь получить информацию об IP-адресе пользователя, вызвав request.getRemoteAddr() изнутри processRequest(HttpServletRequest request,HttpServletResponse response).

Но он возвращает неправильный IP. Поскольку я не очень разбираюсь в этой области, я не знаю, что она отображает, может быть, прокси, я получил следующее:

RemoteAddr : 127.0.0.1
RemoteHost : 127.0.0.1
x-forwarded-for : null

127.0.0.1 не мой IP.

Тем не менее, когда я перейду к: http://www.javascriptkit.com/script/script2/displayip.shtml, он отобразит правильный, поскольку я использую сервлет, у меня нет .shtml для моей динамически сгенерированной html-страницы, что я могу сделать? И почему скрипт на этом сайте может отображать его правильно, а request.getRemoteAddr() - нет?

Спасибо за все ответы, теперь у меня есть подсказка, после развертывания на сервере он работает, как ожидалось. Показал правильный адрес.

Но даже когда я разрабатываю его на своем локальном компьютере, как попросить его отображать абсолютный IP-адрес, как если бы он работал на реальном сервере? Или это выполнимо?

Когда вы говорите wrong ip, это адрес в вашем домене? Насколько это неправильно? Не могли бы вы дать нам дополнительную информацию о том, что возвращает вызов является?

Ken Gentle 04.11.2008 21:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
1
33 259
5

Ответы 5

Какой IP-адрес отображается? Я предполагаю, что есть какой-то прокси или что-то меняющее. (Например, на этой странице сценария по понятным причинам отображался IP-адрес моего ADSL-маршрутизатора, а не тот, который находится в моей локальной сети.)

Обновлено: Теперь, когда вы показали, что IP-адрес, который вы видите, 127.0.0.1, ответ довольно ясен - вы видите свой адаптер обратной петли (т.е. ярлык для той же машины), предположительно потому, что вы тестируете на на той же машине, на которой вы работаете. Ответ совершенно правильный.

Попробуйте использовать его на другом компьютере, и вы получите более полезный IP-адрес.

Это тоже будет моим вопросом. Вы просто печатали быстрее. :)

Herms 04.11.2008 21:51

Проверьте заголовок X-Forwarded-For, вызвав request.getHeader («X-Forwarded-For»), и посмотрите, какой IP он возвращает.

Мы используем этот заголовок, и если он недоступен, используем request.getRemoteAddr ()

singhspk 23.07.2013 20:58

Возвращенный IP-адрес, который вы показываете, является IP-адресом локального хоста. Возникает вопрос - где вы тестируете и как вы получаете доступ к сервлету для тестирования?

Если вы запускаете сервлет на своем локальном (разрабатываемом) компьютере, а также вызываете его из браузера на том же компьютере, то этот вывод абсолютно верен.

Ваше здоровье,

Вы запускаете свой тестовый сервер на локальном компьютере и подключаетесь к нему по http: // localhost /. Поскольку вы подключаетесь через локальный интерфейс, источником подключения также является localhost, он же 127.0.0.1.

Если вы вызываете свой сервлет с помощью http: // локальный: 8080 / сервлет, вы обычно получаете "localhost" в качестве удаленного адреса. Если вы используете имя своего компьютера, то есть http: // yourmachine / сервлет, вы обычно получаете «правильный» адрес.

Другие вопросы по теме