Wenn die Reverse -Proxy -Software verwendet wird, bei der URL von http://192.168.1.110:2046/ zur URL von http://www.xxx.com/ verwenden Sie die Methode Request.getRemoteaddr (), um die IP zu erhalten Adresse, die mit der Request.GetRemoteaddr () -Methode erhalten wurde.
Nachdem der Proxy bestanden hat, kann der Server, da eine Zwischenschicht zwischen dem Client und dem Dienst hinzugefügt wird, die IP des Clients nicht direkt und die serverseitige Anwendung nicht direkt über die Weiterleitungsadresse direkt zum Client zurückkehren. In den HTTP-Header-Informationen zur Weiterleitung der Anfrage werden jedoch X-forward-for-Informationen hinzugefügt. Wird verwendet, um die ursprüngliche Client -IP -Adresse und die vom ursprünglichen Client angeforderte Serveradresse zu verfolgen. Wenn wir auf http://www.xxx.com/index.jsp/ zugreifen, ist es nicht unser Browser, der tatsächlich auf die Index.jsp -Datei auf dem Server zugreift, sondern auf den Proxy -Server zuerst http: //192.168. 2046/Index.jsp gibt der Proxy -Server das zugegriffene Ergebnis in unseren Browser zurück. Der Proxy -Server, nicht die IP -Adresse des Clients.
Anschließend kann eine Methode zur Erlangung der realen IP -Adresse des Clients erhalten werden:
Die Codekopie lautet wie folgt:
public String getremortip (httpServletRequest -Anfrage) {{
if (request.getheader ("x-forward-for") == null) {
return request.getRemoteaddr ();
}
return request.getheader ("x-forward-for");
}
Aber wenn ich http://www.xxx.com/index.jsp/ besuche, ist die zurückgegebene IP -Adresse immer unbekannt, nicht 127.0.0.1 oder 192.168.1.110, wie oben gezeigt, und ich besuche http: // wenn /192.168. 1.110: 2046/index.jsp, die reale IP -Adresse des Clients kann zurückgegeben und eine Methode geschrieben werden, um dies zu überprüfen. Der Grund liegt in Tintenfisch. Das adwited_for-Element in der Squid.conf-Konfigurationsdatei wird standardmäßig eingestellt.
Daher kann die zweite Methode zur Ermittlung der realen IP -Adresse des Kunden erhalten werden:
Die Codekopie lautet wie folgt:
public String getiPaddr (httpServletRequest -Anfrage) {{
String ip = request.getheader ("x-forward-for");
if (ip == null || ip.length () == 0 || "unbekannt" .EqualSignoreCase (ip)) {
ip = request.getheader ("Proxy-Client-IP");
}
if (ip == null || ip.length () == 0 || "unbekannt" .EqualSignoreCase (ip)) {
ip = request.getheader ("wl-proxy-client-ip");
}
if (ip == null || ip.length () == 0 || "unbekannt" .EqualSignoreCase (ip)) {
ip = request.getRemoteaddr ();
}
IP zurückgeben;
}
Wenn jedoch ein Multi-Level-Reverse-Proxy übergeben wird, gibt es mehr als einen Wert von X-Forward-für eine Reihe von IP-Werten.
Die Antwort lautet, die erste nicht unbekannte IP-Zeichenfolge in X-Forward-für zu übernehmen.
wie:
Die Codekopie lautet wie folgt:
X-forwarded-for: 192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
Die tatsächliche IP des Benutzers ist: 192.168.1.110