2012-08-22 18 views
6

Poniższy kod wraca nieprawidłowo, z tego co rozumiem:HttpServletRequest getRemoteAddr() nie działa jak spodziewałbym

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" 

Każdy pomysł, dlaczego tam jest 0%? Kiedy pętli

InetAddress.getAllByName("localhost") 

uzyskać następujące:

// ["192.168.100.1", "127.0.0.1", "0:0:0:0:0:0:1"] 

Jak przetestować na localhost jeśli getRemoteAddr() zwraca nieprawidłowy format, czy robię coś źle?

Dzięki!

Odpowiedz

4

Problemem jest to, te dwie funkcje

1) java.net.InetAddress.getAllByName (ciąg)

i

2) javax.servlet.ServletRequest.getRemoteAddr()

Są bardzo różne. Pierwsza funkcja jest częścią standardowego środowiska wykonawczego Java, a druga jest implementowana przez kontener Java EE. Używasz Tomcat7, więc dodawany jest opcjonalny parametr strefy% 0.

Podsumowując, nie powinieneś robić porównania ciągów na adresach IP, takich jakie jesteś.

To, co naprawdę należy robić, to korzystanie z org.apache.catalina.filters.RemoteIpFilter. Czyni to, co próbujesz zrobić w dobrze określony sposób.

Przykład:

<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> 

Zobacz http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Remote_IP_Filter aby uzyskać więcej informacji.

+0

+1 za dobre informacje/na temat środowiska wykonawczego Java kontra kontenera w celu wykonania dwóch metod. –

+0

Dzięki Phillip. –

2

0:0:0:0:0:0:0:1%0 to poprawny długi formularz dla hosta lokalnego IPv6. %0 określa opcjonalny indeks strefy. Jest to więcej informacji na temat IPv6 Zone Indices.

nie wiem dlaczego wywołanie httpRequest.getRemoteAddr(); wraca opcjonalny wskaźnik strefy w% 0, a

InetAddress.getAllByName("localhost") 

nie. Jednakże, moim zaleceniem jest to, że jeśli szukasz dopasowania na localhost, dopasujesz oba wzorce lub zrobisz startWith match.

+0

Dobrze wiedzieć, a to dziwne, że zwracają różne wyniki. Nie chcę jednak sprawdzać, czy włącza się lub zaczyna. Zbyt wiele dziwnych sytuacji: 192.168.100.1> 192.168.100.12, itp. – andrewpthorp

+1

Dokumentacja dla InetAddress mówi "może zawierać indeks zakresu", więc nie ma radości w ten sposób ... http://download.java.net/jdk7/archive/b123/ docs/api/java/net/InetAddress.html # getAllByName% 28java.lang.String% 29 – Alfabravo

+0

Sądzę, że byłem nieco niejasny, gdy wspomniałem "dopasuj na obu wzorach lub rozpocznij od meczu". Proszę pozwolić mi wyjaśnić. Twoje konkretne pytanie dotyczyło braku możliwości dopasowania ze względu na końcowe "% 0". Aby dopasować adres IPv6, powinieneś zignorować opcjonalny indeks strefy i dopasować go do '0: 0: 0: 0: 0: 0: 0: 1'. Ten opcjonalny indeks strefy będzie zależny od systemu operacyjnego.Na przykład, w systemie Linux twoja pętla zwrotna IPv6 może mieć postać '0: 0: 0: 0: 0: 0: 0: 1% eth0' oraz w systemie Windows może to być' 0: 0: 0: 0: 0: 0: 0: 1% 0' –

Powiązane problemy