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.