Если вы request.getRemoteAddr();
и если пользователь находится за прокси-сервером или доступа к веб-серверу через балансировки нагрузки, то приведенный выше код будет получить IP-адрес сервера, прокси-сервера или балансировки нагрузки, а не исходный IP-адрес клиента.
Так что если
В моем случае это нормально, чтобы просто получить IP прокси-службы
вы с этим согласны, то request.getRemoteAddr(); достаточно.
Но в идеальном случае вы должны попробовать это
//is client behind something?
String ipAddress = request.getHeader("X-FORWARDED-FOR");
if (ipAddress == null) {
ipAddress = request.getRemoteAddr();
}
X_FORWARDED_FOR
X-Forwarded For-(XFF) HTTP поля заголовка является стандартом де-факто для идентификации происходящий IP адрес клиента, подключающегося к веб-серверу через прокси-сервер HTTP или балансировщик нагрузки.
HTTP_X_FORWARDED_FOR
HTTP_X_FORWARDED_FOR заголовка устанавливается прокси-серверами для определения IP-адрес хоста, который делает запрос HTTP через прокси-сервер.
Короче говоря, это все тот же заголовок, который по-разному упоминается различными вариантами. Для более детального просмотра: HTTP Headers: What is the difference between X-FORWARDED-FOR, X_FORWARDED_FOR and HTTP_X_FORWARDED_FOR?
Это * можно * подделать, но это намного сложнее. Он поступает из IP-пакета, а не из HTTP-заголовка. – EJP
Спасибо! Если я правильно понимаю: HTTP-заголовок находится в «прикладном уровне» модели OSI, поэтому он легко подделывается через программу (один из них java), но если я хочу изменить возвращаемое значение ServletRequest.getRemoteAddr, мне нужно проанализировать ip пакет, который намного сложнее. – bylijinnan