In JSP lautet die Methode zum Abrufen der IP-Adresse des Clients: request.getRemoteAddr(). Diese Methode ist in den meisten Fällen effektiv. Die tatsächliche IP-Adresse des Clients kann jedoch nicht über Reverse-Proxy-Software wie Apache und Squid ermittelt werden. Wenn Reverse-Proxy-Software verwendet wird, lautet die mit der Methode request.getRemoteAddr() erhaltene IP-Adresse: 127.0.0.1 oder 192.168.1.110, nicht die tatsächliche IP des Clients.
Da nach dem Durchlaufen des Proxys eine Zwischenschicht zwischen dem Client und dem Dienst hinzugefügt wird, kann der Server die IP des Clients nicht direkt abrufen und die serverseitige Anwendung kann die Adresse der weitergeleiteten Anforderung nicht direkt an den Client zurückgeben. Den HTTP-Header-Informationen der weitergeleiteten Anfrage werden jedoch X-FORWARDED-FOR-Informationen hinzugefügt. Wird verwendet, um die IP-Adresse des ursprünglichen Clients und die vom ursprünglichen Client angeforderte Serveradresse zu verfolgen. Wenn wir auf index.jsp/ zugreifen, ist es nicht wirklich unser Browser, der auf die Datei index.jsp auf dem Server zugreift. Stattdessen greift der Proxyserver zuerst auf index.jsp zu und der Proxyserver gibt die Zugriffsergebnisse an uns zurück. Da der Proxyserver auf index.jsp zugreift, ist die über die Methode request.getRemoteAddr () in index.jsp erhaltene IP tatsächlich die Adresse des Proxyservers und nicht die IP-Adresse des Clients.
Wir können uns also Methode eins ausdenken, um die tatsächliche IP-Adresse des Clients zu erhalten:
public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
Methode 2, um die echte IP-Adresse des Clients zu erhalten:
public String getIpAddr(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.getRemoteAddr();
}
Rückgabe-IP;
}
Wenn jedoch ein mehrstufiger Reverse-Proxy übergeben wird, ist der Wert von X-Forwarded-For nicht nur einer, sondern eine Reihe von IP-Werten. Welcher ist die echte IP des echten Clients?
Die Antwort besteht darin, die erste nicht unbekannte gültige IP-Zeichenfolge in X-Forwarded-For zu verwenden. wie:
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 lautet: 192.168.1.110