it-swarm.com.de

Abrufen der IP-Adresse des Clients

Ich entwickle eine Webanwendung mit JSP , Servlets (Container: Glassfish), in dem ich brauche Kunden bekommen IP Address.

Ich erhalte die IP-Adresse des Kunden, da ich den Zugriff auf einige Seiten (z. B. Kundenwartungsformulare) nur auf Computern innerhalb des Büros gewähren möchte. Ich möchte den Zugriff auf diese Seiten außerhalb des Büros einschränken.

Folgendes ist mein Code bisher:

way1

String ipAddress =  request.getRemoteAddr();
System.out.println("IP Address: "+ipAddress);

way2

String ipAddress=null;
String getWay = request.getHeader("VIA");   // Gateway
ipAddress = request.getHeader("X-FORWARDED-FOR");   // proxy
if(ipAddress==null)
{
    ipAddress = request.getRemoteAddr();
}
System.out.println("IP Address: "+ipAddress);

Der obige Code gibt mir different IP Address jedes Mal, wenn ich meinen Computer neu starte (Herunterfahren-> Starten oder Neustarten).

Ich bekomme IP6 mögen:

fe80:0:0:0:20ca:1776:f5ff:ff15%13

Lassen Sie mich wissen, was mit diesem Code nicht stimmt?

41
Bhushan

Wie @martin und diese Antwort erklärt haben, ist es kompliziert. Es gibt keine kugelsichere Möglichkeit, die IP-Adresse des Kunden abzurufen.

Das Beste, was Sie tun können, ist zu versuchen, "X-Forwarded-For" Zu analysieren und sich auf request.getRemoteAddr(); zu verlassen.

public static String getClientIpAddress(HttpServletRequest request) {
    String xForwardedForHeader = request.getHeader("X-Forwarded-For");
    if (xForwardedForHeader == null) {
        return request.getRemoteAddr();
    } else {
        // As of https://en.wikipedia.org/wiki/X-Forwarded-For
        // The general format of the field is: X-Forwarded-For: client, proxy1, proxy2 ...
        // we only want the client
        return new StringTokenizer(xForwardedForHeader, ",").nextToken().trim();
    }
}
68

Ich verwende die folgende statische Hilfsmethode, um die IP eines Clients abzurufen:

public static String getClientIpAddr(HttpServletRequest request) {  
    String ip = request.getHeader("X-Forwarded-For");  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("WL-Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_X_FORWARDED");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_X_CLUSTER_CLIENT_IP");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_CLIENT_IP");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_FORWARDED_FOR");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_FORWARDED");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_VIA");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("REMOTE_ADDR");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getRemoteAddr();  
    }  
    return ip;  
}
31
basZero

Ich mag das, du kannst es versuchen

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();      
   }      
   return ip;      
}   
7
coffee

Wie in basZero erwähnt, sollte X-Forwarded-For auf Komma überprüft werden. (Siehe: http://en.wikipedia.org/wiki/X-Forwarded-For ). Das allgemeine Format des Felds lautet: X-Forwarded-For: clientIP, proxy1, proxy2 ... und so weiter. Wir werden also so etwas sehen: X-FORWARDED-FOR: 129.77.168.62, 129.77.63.62.

3
mkilic

Ich glaube, es hängt mehr davon ab, wie Ihr Netzwerk konfiguriert ist. Servlet gibt Ihnen einfach die Adresse, die es findet.

Ich kann zwei Problemumgehungen vorschlagen. Versuchen Sie zuerst, IPV4 zu verwenden. Siehe dies SO Antwort

Verwenden Sie auch die request.getRemoteHost () -Methode, um die Namen der Computer abzurufen. Sicherlich sind die Namen unabhängig von der IP-Adresse, der sie zugeordnet sind.

Ich denke immer noch, du solltest das mit deinen Infrastruktur-Leuten besprechen.

1
Raza