Когда HttpServletRequest getHeader вернет неизвестность?

Я использую приведенный ниже код (Скопировано из другого поста - Как получить удаленный адрес клиента в сервлете?), Чтобы получить IP-адрес клиента и прокси-сервер (SpringBoot Appln, развернутый в PCF).

  public static String getClientIpAddr(HttpServletRequest request)
  {
    String ip = request.getHeader("X-Forwarded-For");
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
    {
      ip = request.getHeader("Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
    {
      ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
    {
      ip = request.getHeader("HTTP_CLIENT_IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
    {
      ip = request.getHeader("HTTP_X_FORWARDED_FOR");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
    {
      ip = request.getRemoteAddr();
    }
    return ip;
  }

request.getHeader ("X-Forwarded-К"); /request.getRemoteAddr(); (при запуске из локального) дает ожидаемый результат. Я действительно не понимал использование других условий.

  1. Во всех условиях я вижу "неизвестно".equalsIgnoreCase(IP) используется. Но когда я пытаюсь получить доступ к request.getHeader("Proxy-Client-IP") или к любой ненужной строке, я получаю нулевое значение. Когда HttpServletRequest getHeader вернет неизвестность? Можно ли это игнорировать?
  2. Какая польза от Proxy-Client-IP/HTTP_CLIENT_IP. Я предполагаю, что он используется для получения IP-адреса клиента (без IP-адреса прокси-сервера). Это специфично для конкретного сервера? если так, то какой сервер. Может ли это быть проигнорировано в загрузочном приложении Spring
  3. Я предполагаю, что "WL-Proxy-Client-IP" специфичен для WebLogic. Можно ли это также игнорировать?
  4. Я считаю, что префикс HTTP_ специфичен для PHP (HTTP_X_FORWARDED_FOR и HTTP_CLIENT_IP.) Это необходимо в приложении SpringBoot?
  5. Мне кажется, что приведенного ниже кода более чем достаточно, чтобы получить IP-адрес клиента вместе с прокси-сервером (при условии, что я использую весеннюю загрузку со встроенным tomcat и внедряю код в PCF). Не могли бы вы подтвердить?

    private static String getClientIpAddr(HttpServletRequest httpRequest)
    {
      String clientIp = httpRequest.getHeader("X-Forwarded-For");
    
      if (clientIp == null || clientIp.length() == 0)
      {
        clientIp = httpRequest.getRemoteAddr();
      }
      return clientIp;
    }
    

1 ответ

Вы, вероятно, хотите что-то подобное.

public class HttpRequestHelper {

    private static final String[] HEADERS= {"X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_CLIENT_IP", "HTTP_X_FORWARDED_FOR"};

    public static String getClientIpAddr(HttpServletRequest request) {
        for (String header : HEADERS) {
            String ip = request.getHeader(header);
            if (ip != null && ip.length() > 0) {                    
                return StringUtils.commaDelimitedListToStringArray(ip)[0];
            }
        }
        return request.getRemoteAddr();
    }    
}

Это попробует все заголовки (в указанном порядке) и, если таковые существуют, вернет это. Иначе это будет откат к request.getRemoteAddr(), Достигает того же с гораздо меньшим if заявления.

Я также учел в случае потенциальных нескольких IP-адресов в X-Forwarded-For заголовок. Он всегда будет возвращать первый элемент в разобранном массиве.

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