Как получить IP-адрес из HTTP-заголовка в Java

Мне любопытно, есть ли какая-либо библиотека, которая обрабатывает уже такие вещи, или я должен сделать это сам еще раз. Итак, я хочу получить поле IP-адреса из запроса HTTP-заголовка посетителей на моем сервере и сделать все на Java? Любая помощь будет приятной. Заранее спасибо.

Используйте метод getHeader(String Name) объекта javax.servlet.http.HttpServletRequest для извлечения значения переменной Remote_Addr . Вот пример кода:

 String ipAddress = request.getHeader("Remote_Addr"); 

Если этот код возвращает пустую строку, используйте этот способ:

 String ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR"); if (ipAddress == null) { ipAddress = request.getRemoteAddr(); } 

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

request.getHeader("Remote_Addr") указан так, чтобы он возвращался точно так же, как request.getRemoteAddr() . Следовательно, нет смысла проверять оба. Также обратите внимание, что getRemoteAddr – это метод javax.servlet.ServletRequest (т. getHeader HTTP-агностик), в то время как getHeader находится в javax.servlet.http.HttpServletRequest .

Кроме того, некоторые прокси используют Client-IP а не X-Forwarded-For . Для обсуждения см. https://stackoverflow.com/a/7446010/131929 .

Я не знаю, насколько надежным является использование HTTP_X_FORWARDED_FOR над X-Forwarded-For . В Java я предпочел бы использовать прямую короткую форму. Для обсуждения см. https://stackoverflow.com/a/3834169/131929 . Верхний / нижний регистр не имеет значения, потому что getHeader указан как чувствительный к регистру.

Альтернатива Java

 public final class ClientIpAddress { // CHECKSTYLE:OFF // https://stackoverflow.com/a/11327345/131929 private static Pattern PRIVATE_ADDRESS_PATTERN = Pattern.compile( "(^127\\.)|(^192\\.168\\.)|(^10\\.)|(^172\\.1[6-9]\\.)|(^172\\.2[0-9]\\.)|(^172\\.3[0-1]\\.)|(^::1$)|(^[fF][cCdD])", Pattern.CANON_EQ); // CHECKSTYLE:ON private ClientIpAddress() { } /** * Extracts the "real" client IP address from the request. It analyzes request headers * {@code REMOTE_ADDR}, {@code X-Forwarded-For} as well as {@code Client-IP}. Optionally * private/local addresses can be filtered in which case an empty string is returned. * * @param request HTTP request * @param filterPrivateAddresses true if private/local addresses (see * https://en.wikipedia.org/wiki/Private_network#Private_IPv4_address_spaces and * https://en.wikipedia.org/wiki/Unique_local_address) should be filtered ie omitted * @return IP address or empty string */ public static String getFrom(HttpServletRequest request, boolean filterPrivateAddresses) { String ip = request.getRemoteAddr(); String headerClientIp = request.getHeader("Client-IP"); String headerXForwardedFor = request.getHeader("X-Forwarded-For"); if (StringUtils.isEmpty(ip) && StringUtils.isNotEmpty(headerClientIp)) { ip = headerClientIp; } else if (StringUtils.isNotEmpty(headerXForwardedFor)) { ip = headerXForwardedFor; } if (filterPrivateAddresses && isPrivateOrLocalAddress(ip)) { return StringUtils.EMPTY; } else { return ip; } } private static boolean isPrivateOrLocalAddress(String address) { Matcher regexMatcher = PRIVATE_ADDRESS_PATTERN.matcher(address); return regexMatcher.matches(); } } 

Альтернатива PHP

 function getIp() { $ip = $_SERVER['REMOTE_ADDR']; if (empty($ip) && !empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { // omit private IP addresses which a proxy forwarded $tmpIp = $_SERVER['HTTP_X_FORWARDED_FOR']; $tmpIp = filter_var( $tmpIp, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ); if ($tmpIp != false) { $ip = $tmpIp; } } return $ip; } 
  • Разница между наследованием и композицией
  • замените \ n и \ r \ n в java
  • Как проверить логическое состояние в EL?
  • Что делает пустота в java?
  • Самый простой способ объединить два списка в карту (Java)?
  • Ресурс из src / main / ресурсов не найден после сборки с maven
  • @Transactional метод вызова другого метода без @Transactional anotation?
  • Преобразование существующего проекта Eclipse в проект Maven
  • Java: лучший способ передать int по ссылке
  • почему java-polymorphism не работает в моем примере
  • Почему javac не работает при annotations @Override
  • Interesting Posts

    Антенна с высоким коэффициентом усиления: установите Wi-Fi-маршрутизатор на одну антенну или два

    Почему я получаю ошибку для apple-touch-icon-precomposed.png

    Алгоритм случайного генерирования эстетически приятной цветовой палитры

    Есть ли веские причины не использовать ОРМ?

    Учетная запись администратора повреждена?

    Возможно ли «декомпилировать» Windows .exe? Или, по крайней мере, рассмотреть Ассамблею?

    Почему C # не предоставляет ключевое слово ‘friend’ стиля C ++?

    Какая техническая разница между флеш-накопителем и SSD?

    Как я могу получить размер папки на SD-карте в Android?

    Используйте «real» CultureInfo.CurrentCulture в привязке WPF, а не CultureInfo от IetfLanguageTag

    Ошибка: «Узел должен быть вставлен из другого контекста документа»

    Поддерживает ли Ninject Func (автоматически сгенерированный завод)?

    Неслучайная соль для hashей паролей

    Cracking truecrypt файлы за считанные минуты? Или просто перекодировать жесткие диски за считанные минуты?

    jQuery onclick toggle имя classа

    Давайте будем гением компьютера.