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:
String ipAddress = request.getRemoteAddr();
System.out.println("IP Address: "+ipAddress);
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?
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();
}
}
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;
}
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;
}
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.
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.