Когда 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(); (при запуске из локального) дает ожидаемый результат. Я действительно не понимал использование других условий.
- Во всех условиях я вижу "неизвестно".equalsIgnoreCase(IP) используется. Но когда я пытаюсь получить доступ к request.getHeader("Proxy-Client-IP") или к любой ненужной строке, я получаю нулевое значение. Когда HttpServletRequest getHeader вернет неизвестность? Можно ли это игнорировать?
- Какая польза от Proxy-Client-IP/HTTP_CLIENT_IP. Я предполагаю, что он используется для получения IP-адреса клиента (без IP-адреса прокси-сервера). Это специфично для конкретного сервера? если так, то какой сервер. Может ли это быть проигнорировано в загрузочном приложении Spring
- Я предполагаю, что "WL-Proxy-Client-IP" специфичен для WebLogic. Можно ли это также игнорировать?
- Я считаю, что префикс HTTP_ специфичен для PHP (HTTP_X_FORWARDED_FOR и HTTP_CLIENT_IP.) Это необходимо в приложении SpringBoot?
Мне кажется, что приведенного ниже кода более чем достаточно, чтобы получить 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
заголовок. Он всегда будет возвращать первый элемент в разобранном массиве.