Comment obtenir l'adresse distante d'un client dans servlet?

y a-t-il un moyen que je puisse obtenir l'adresse IP originale du client venant sur le serveur? Je peux utiliser request.getRemoteAddr() , mais j'ai toujours l'impression d'avoir L'IP du proxy ou du serveur web.

je voudrais connaître l'adresse IP que le client utilise pour me connecter à moi. Est-il de toute façon que je puisse obtenir?

59
demandé sur BalusC 2011-01-13 13:06:11

8 réponses

essayez ceci:

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;  
    }  
93
répondu Fareed Alnamrouti 2013-03-10 15:16:43

request.getRemoteAddr() est le chemin. Il semble que votre mandataire change l'adresse IP source. Lorsque certains mandataires le font, ils ajoutent L'IP d'origine dans un en-tête http personnalisé. Utilisez request.getHeaderNames() et request.getHeaders(name) et imprimez-les tous pour voir s'il n'y a rien d'intéressant. Comme X-CLIENT-IP (inventé celui-là vers le haut, mais ils ressemblent à ceci)

8
répondu Bozho 2016-02-16 14:33:25

vous ne pouvez pas faire cela d'une manière significative.

le proxy peut ou non Ajouter un en-tête proxied-for, mais dans de nombreux cas ce sera une adresse interne seulement de toute façon, il sera donc sans signification pour vous. La plupart des mandataires à la limite d'une organisation sont configurés pour révéler le moins possible sur les internes du réseau de toute façon.

à quoi comptez-vous utiliser ces informations?

4
répondu time4tea 2011-01-13 10:24:09

La meilleure solution que j'ai jamais utilisé

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;      
} 
4
répondu Ali Hashemi 2013-11-06 07:06:39

comme il s'agit habituellement d'un problème de déploiement, plutôt que d'un problème d'application, une autre approche consisterait à configurer le conteneur d'application de façon appropriée. Une fois configuré, le conteneur prend soin d'inspecter l'en-tête approprié et votre application continue d'utiliser request.getRemoteAddr() .

par exemple, dans Tomcat vous pouvez utiliser la Valve IP à distance . Je suppose que la plupart des serveurs d'applications ont des fonctionnalités similaires.

le conteneur peut également prendre soin de comprendre si votre équilibreur de charge frontal termine les connexions SSL, en transmettant la requête au serveur app via HTTP. Ceci est important lorsque votre application doit générer des URLs vers elle-même.

4
répondu craigforster 2014-07-14 20:30:45
String ipAddress = request.getHeader("x-forwarded-for");
        if (ipAddress == null) {
            ipAddress = request.getHeader("X_FORWARDED_FOR");
            if (ipAddress == null){
                ipAddress = request.getRemoteAddr();
            }
        }
0
répondu Srinivasu 2013-06-06 06:12:53

"X-forwarded-for" l'en-tête de requête contient l'adresse IP du client d'origine si vous utilisez un mandataire ou un équilibreur de charge. Mais je pense que tous les mandataires / lb n'ajoutent pas cet en-tête.

voici du code java pour analyser l'en-tête: http://www.codereye.com/2010/01/get-real-ip-from-request-in-java.html

si cet en-tête n'est pas présent alors je procéderais comme @Bozho suggère

0
répondu Emilio 2013-07-10 12:09:09
InetAddress inetAddress = InetAddress.getLocalHost();
String ip = inetAddress.getHostAddress();
-5
répondu Nitesh Chourasia 2015-07-24 06:32:30