HttpServletRequest getRemoteAddr() не работает, как я ожидал
следующий код возвращается неправильно, из чего я понимаю:
HttpServletRequest httpRequest = (HttpServletRequest) request;
String userIPAddress = httpRequest.getRemoteAddr();
// Actual
// "0:0:0:0:0:0:0:1%0"
// Expected
// "0:0:0:0:0:0:0:1"
есть идеи, почему %0 существует? Когда я петлю через
InetAddress.getAllByName("localhost")
Я получаю следующее:
// ["192.168.100.1", "127.0.0.1", "0:0:0:0:0:0:1"]
как бы я проверил localhost, если getRemoteAddr() возвращает недопустимый формат или я делаю что-то неправильно?
спасибо!
2 ответов
проблема в этих двух функциях
1) java.сеть.InetAddress.getAllByName (строка)
и
2) javax.сервлет.ServletRequest.getRemoteAddr()
очень разные. Первая функция является частью стандартной среды выполнения Java, а вторая реализуется вашим контейнером Java EE. Вы используете Tomcat7, поэтому добавляется необязательный параметр зоны %0.
нижняя строка, вы не должны делать сравнение строк на ip такие адреса, как у вас.
то, что вы действительно должны делать, это использовать org.apache.catalina.filters.RemoteIpFilter
. Это делает то, что вы пытаетесь сделать четко определенным образом.
пример:
<filter>
<filter-name>RemoteIpFilter</filter-name>
<filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
<init-param>
<param-name>allowedInternalProxies</param-name>
<param-value>192\.168\.0\.10|192\.168\.0\.11</param-value>
</init-param>
<init-param>
<param-name>remoteIpHeader</param-name>
<param-value>x-forwarded-for</param-value>
</init-param>
<init-param>
<param-name>remoteIpProxiesHeader</param-name>
<param-value>x-forwarded-by</param-value>
</init-param>
<init-param>
<param-name>protocolHeader</param-name>
<param-value>x-forwarded-proto</param-value>
</init-param>
</filter>
см.http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Remote_IP_Filter для получения дополнительной информации.
0:0:0:0:0:0:0:1%0
является допустимой длинной формой для локального хоста IPv6. The %0
указывает необязательный индекс зоны.
здесь больше информации о Индексы Зон IPv6.
Я не знаю, почему вызов httpRequest.getRemoteAddr();
возвращает необязательный индекс зоны %0 и
InetAddress.getAllByName("localhost")
нет. Тем не менее, моя рекомендация заключается в том, что если вы хотите соответствовать localhost, вы соответствуете обоим шаблонам или делаете матч startsWith.