Правильный способ получить IP пользователя - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть следующий код, который должен получить IP-адрес пользователя:

public String getUserIP()
{
   Object details = getDetails();
   if (details instanceof WebAuthenticationDetails)
   {
     return ((WebAuthenticationDetails)details).getRemoteAddress();
   }
   return "";
}

@Nullable
public Object getDetails()
{
   Authentication authentication = getCurrentUserAuth();
   return authentication != null ? authentication.getDetails() : null;
}

Однако при некоторых неизвестных обстоятельствах он возвращает 127.0.0.1 вместо реального IP-адреса.

Я решил переписать так:

public String getUserIP() 
{
  ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
  HttpServletRequest request = attr.getRequest();

  String ip = request.getHeader("X-Forwarded-For").split(',')[0]; 

  return ip;
}

Но в некоторых случаях заголовок X-Forwarded-For равен нулю.Исключение возникает только тогда, когда getUserIP() из первого фрагмента возвращает действительный IP-адрес.В чем проблема?Веб-сервер Tomcat.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Вы можете попробовать это

public static String getUserIP(HttpServletRequest request) {
String xForwardedForHeader = request.getHeader("X-Forwarded-For");
if (xForwardedForHeader == null) {
    return request.getRemoteAddr();
} else {
    // As of https://en.wikipedia.org/wiki/X-Forwarded-For
    // The general format of the field is: X-Forwarded-For: client, proxy1, proxy2 ...
    // we only want the client
    return new StringTokenizer(xForwardedForHeader, ",").nextToken().trim();
}

}

0 голосов
/ 26 сентября 2019

Вы можете обновить как это.


public String getUserIP() 
{
  ServletRequestAttributes attr = (ServletRequestAttributes) 
  RequestContextHolder.currentRequestAttributes();
  HttpServletRequest request = attr.getRequest();
  return request.getRemoteAddr();
}
...