2012-08-22 19 views
6

Il seguente codice sta tornando in modo non corretto, da quanto ho capito:HttpServletRequest getRemoteAddr() non funziona come mi aspetterei

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" 

Qualsiasi idea del perché l'% 0 è lì? Quando ho un ciclo tra

InetAddress.getAllByName("localhost") 

ottengo il seguente:

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

Come dovrei provare per localhost se getRemoteAddr() sta tornando formato non valido, o sto facendo qualcosa di sbagliato?

Grazie!

risposta

4

Il problema è queste due funzioni

1) java.net.InetAddress.getAllByName (String)

e

2) javax.servlet.ServletRequest.getRemoteAddr()

Sono molto diversi La prima funzione è parte del runtime Java standard e la seconda è implementata dal contenitore Java EE. Stai utilizzando Tomcat7 in modo che venga aggiunto il parametro facoltativo di zona% 0.

In conclusione, non dovresti fare il confronto delle stringhe su indirizzi IP come sei.

Quello che dovresti fare è usare lo org.apache.catalina.filters.RemoteIpFilter. Questo fa ciò che stai cercando di fare in un modo ben definito.

Esempio:

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

Vedi http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Remote_IP_Filter per maggiori informazioni.

+0

+1 per una buona informazione/riflessione sul contenitore Java runtime vs per l'esecuzione dei due metodi. –

+0

Grazie Philip. –

2

0:0:0:0:0:0:0:1%0 è un modulo lungo valido per IPv6 localhost. Lo %0 specifica l'indice di zona facoltativo.

Ecco ulteriori informazioni su IPv6 Zone Indices.

Non so il motivo per cui una chiamata a httpRequest.getRemoteAddr(); sta tornando l'indice orario facoltativo del% 0, e

InetAddress.getAllByName("localhost") 

non lo fa. Tuttavia, la mia raccomandazione è che se stai cercando di corrispondere su localhost, ti abbini su entrambi i pattern, o fai una partita con la corrispondenza.

+0

Buono a sapersi, ed è strano che restituiscano risultati diversi. Tuttavia, non desidero controllare l'inclusione o avviareWith. Troppe strane situazioni: 192.168.100.1> 192.168.100.12, ecc. – andrewpthorp

+1

La documentazione per InetAddress dice "può includere l'indice di scope", quindi non c'è gioia in questo modo ... http://download.java.net/jdk7/archive/b123/ docs/api/java/net/InetAddress.html # getAllByName% 28java.lang.String% 29 – Alfabravo

+0

Immagino di essere stato un po 'vago quando ho menzionato "abbinare su entrambi i modelli o fare un inizio con la corrispondenza". Per favore, permettimi di chiarire. La tua domanda ha menzionato esplicitamente di non essere in grado di eguagliare a causa del trailing '% 0'. Per la corrispondenza con l'indirizzo IPv6, dovresti ignorare l'indice di zona facoltativo e abbinare semplicemente su '0: 0: 0: 0: 0: 0: 0: 1'. Questo indice di zona facoltativo sarà dipendente dal sistema operativo.Ad esempio, su Linux il tuo loopback IPv6 potrebbe essere '0: 0: 0: 0: 0: 0: 0: 1% eth0' e su Windows potrebbe essere' 0: 0: 0: 0: 0: 0: 0: 1% 0' –

Problemi correlati