2016-07-06 14 views
0

Ich versuche, die IP von HttpServletRequest zu bekommen, wenn jemand eine POST-Anfrage an meine REST-Schnittstelle (ich benutze Jax-Rs). Hier ist die Methode, die ich bin mit dem IP zu erhalten (in einer anderen Frage hier auf Stackoverflow gefunden):Unerwartetes Ergebnis beim Versuch, ip von HttpServletRequest zu erhalten

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

Das Ergebnis erhalten, wenn Sie eine Anfrage machen (in diesem Fall von PostMan) ist dieser String: fe80:0:0:0:89a0:94d3:58a:a4e3%24. Für mich ist das unerwartet. Ich muss verstehen, wie man eine richtige IP bekommt.

Wie aus den Kommentaren zu verstehen, was ich bekomme, ist die IPv6-Adresse, was ich brauche, ist die IPv4-Adresse.

Antwort

1

Das sieht wie eine IPV6-Adresse mit einem $ am Ende aus. Ich weiß nicht, von welchem ​​Teil der Funktion du das bekommst.

Die traditionelle IPV4-Adresse gehört dazu. Verschiedene Teile der Funktion können verschiedene IP-Versionen zurückgeben. Ich weiß es nicht, aber ich würde einige Spuren hinzufügen, um herauszufinden, was passiert. Sie können ziemlich viel Verwirrung bekommen, wenn Sie nicht wissen, was von wo kommt.

Die GetRemoteAddress Funktion ist die IP-Adresse direkt an das Servlet verbunden, aber natürlich, es usw. gegangen durch Proxies konnte

Hängt wirklich das, was Sie für die IP-Adresse verwenden. Ich würde argumentieren, dass es sich lohnt, die IPV6-Funktionalität für zukünftiges Proofing in das System zu integrieren, selbst wenn diese Zukunft auf dem Weg ist.

+0

Ich überprüft, und es kommt von request.getRemoteAddr(). – user16655

+0

Das hat eine interessante Möglichkeit, entweder IPV4-Adressen oder IPV6-Adressen zu geben, abhängig davon, welchen Eintrag es im DNS für die Domäne gibt, die für den Zugriff auf den Server verwendet wird. Ich bin jedoch immer noch verwirrt über das Dollarzeichen. Es ist zufällig, dass ich vor ein paar Tagen die gleiche Funktion mit Tomcat benutzt habe und ich bekomme den Dollar am Ende nicht. –

+0

Jemand anderes schrieb hier eine gute Antwort: http://stackoverflow.com/questions/3118829/why-request-getremoteaddr-returns-ipv4-or-ipv6-depending-on-context-post-quer –