web-dev-qa-db-fra.com

Obtenir l'adresse IP du client

Je développe une application Web en utilisant JSP , Servlets (Container: Glassfish) dans lequel j'ai besoin obtenir des clients IP Address.

Je reçois l'adresse IP du client, car je veux donner accès à certaines pages (comme les formulaires de maintenance du client) uniquement sur les ordinateurs du bureau, je veux restreindre l'accès à ces pages en dehors du bureau.

Voici mon code jusqu'à présent:

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

Le code ci-dessus me donne different IP Address _ à chaque fois que je redémarre mon ordinateur (Shutdown-> Start or Restart).

Je reçois IP6 comme:

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

Laissez-moi savoir ce qui ne va pas avec ce code?

41
Bhushan

Comme @martin et cette réponse , c'est compliqué. Il n'y a pas de moyen infaillible d'obtenir l'adresse IP du client.

Le mieux que vous puissiez faire est d’essayer d’analyser "X-Forwarded-For" Et de vous appuyer sur request.getRemoteAddr();

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

J'utilise la méthode d'assistance statique suivante pour récupérer l'adresse IP d'un client:

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

J'aime ça, tu peux essayer

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

Comme mentionné par basZero, X-Forwarded-For doit être vérifié pour une virgule. (Regardez: http://en.wikipedia.org/wiki/X-Forwarded-For ). Le format général du champ est le suivant: X-Forwarded-For: clientIP, proxy1, proxy2 ... et ainsi de suite. Nous verrons donc quelque chose comme ceci: X-FORWARDED-FOR: 129.77.168.62, 129.77.63.62.

3
mkilic

Je crois que cela est davantage lié à la configuration de votre réseau. Servlet vous donne simplement l'adresse qu'il a trouvée.

Je peux suggérer deux solutions de contournement. Commencez par utiliser IPV4. Voir ceci SO réponse

Essayez également d'utiliser la méthode request.getRemoteHost () pour obtenir les noms des machines. Les noms sont sûrement indépendants de l'adresse IP vers laquelle ils sont mappés.

Je pense toujours que vous devriez en discuter avec vos gars de l'infrastructure.

1
Raza