Почему я думаю, что мы должны сначала попытаться получить IP из заголовка 'X-Forwarded-For
'? Если вы получаете от request.getRemoteAddr()
, это может быть реальный ip клиента или ip последнего прокси, который перенаправляет запрос . Таким образом, мы не можем сказать, к какому состоянию оно относится. Однако, если в заголовке установлено значение 'X-Forwarded-For
' , ip клиента обязательно будет самой левой частью того, что вы получаете от него.
/**
* Try to get real ip from request:
* <ul>
* <li>try X-Forwarded-For</li>
* <li>try remote address</li>
* </ul>
*
* @param request request
* @return real ip or ""
*/
private String tryGetRealIp(HttpServletRequest request) {
// X-Forwarded-For: <client>, <proxy1>, <proxy2>
// If a request goes through multiple proxies, the IP addresses of each successive proxy is listed.
// This means, the right-most IP address is the IP address of the most recent proxy and
// the left-most IP address is the IP address of the originating client.
String forwards = request.getHeader("X-Forwarded-For");
if (StringUtils.isNotBlank(forwards)) {
// The left-most IP must be client ip
String ip = StringUtils.substringBefore(forwards, ",");
return ip;
} else if (StringUtils.isNotBlank(request.getRemoteAddr())) {
// this could be real client ip or last proxy ip which forwards the request
return request.getRemoteAddr();
}
return "";
}