Получение IP-адреса клиента

Я разрабатываю веб-приложение с использованием JSP, Servlets (Container: Glassfish), в котором мне нужно получить клиентов IP Address.

Я получаю IP-адрес клиентов, потому что я хочу предоставить доступ к некоторым страницам (например, формам обслуживания клиентов) только на компьютерах с офисом, я хочу ограничить доступ к этим страницам вне офиса.

Ниже приведен мой код:

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

Выше кода дает мне different IP Address каждый раз, когда я перезагружаю компьютер (Shutdown- > Start или Restart).

Я получаю IP6 как:

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

Позвольте мне знать, что не так с этим кодом?

Ответ 1

Как объяснил @martin и этот ответ, это сложно. Нет пуленепробиваемого способа получения IP-адреса клиента.

Лучшее, что вы можете сделать, это попытаться разобрать "X-Forwarded-For" и полагаться на 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();
    }
}

Ответ 2

Я использую следующий статический вспомогательный метод для получения IP-адреса клиента:

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

Ответ 3

Мне нравится это, вы можете попробовать

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

Как упоминалось в basZero, X-Forwarded-For следует проверять на запятую. (Посмотрите: http://en.wikipedia.org/wiki/X-Forwarded-For). Общий формат поля: X-Forwarded-For: clientIP, proxy1, proxy2... и так далее. Итак, мы увидим что-то вроде этого: X-FORWARDED-FOR: 129.77.168.62, 129.77.63.62.

Ответ 5

Я считаю, что это больше связано с настройкой вашей сети. Сервл просто дает вам адрес, который он находит.

Я могу предложить два обходных решения. Сначала попробуйте использовать IPV4. См. Этот SO-ответ

Кроме того, попробуйте использовать метод request.getRemoteHost(), чтобы получить имена машин. Разумеется, имена не зависят от того, на какой IP-адрес они сопоставлены.

Я все еще думаю, что вы должны обсудить это с парнями инфраструктуры.

Ответ 6

Вот ответ, чтобы получить клиентский ip для ОС Linux или Windows, проблема просто невозможна в IExplorer.

Но надеюсь, что это может помочь:

//NOTE: window.RTCPeerConnection is "not a constructor" in FF22/23
    var RTCPeerConnection = /*window.RTCPeerConnection ||*/window.webkitRTCPeerConnection
            || window.mozRTCPeerConnection;
    if (RTCPeerConnection)
        (function() {
            var rtc = new RTCPeerConnection({
                iceServers : []
            });
            if (window.mozRTCPeerConnection) { // FF needs a channel/stream to proceed
                rtc.createDataChannel('', {
                    reliable : false
                });
            }
            ;
            rtc.onicecandidate = function(evt) {
                if (evt.candidate)
                    grepSDP(evt.candidate.candidate);
            };
            rtc.createOffer(function(offerDesc) {
                grepSDP(offerDesc.sdp);
                rtc.setLocalDescription(offerDesc);
            }, function(e) {
                console.warn("offer failed", e);
            });
            var addrs = Object.create(null);
            addrs["0.0.0.0"] = false;
            function updateDisplay(newAddr) {
                if (newAddr in addrs)
                    return;
                else
                    addrs[newAddr] = true;
                var displayAddrs = Object.keys(addrs).filter(function(k) {
                    return addrs[k];
                });
                document.getElementById('list').textContent = displayAddrs
                        .join(" or perhaps ")
                        || "n/a";
            }
            function grepSDP(sdp) {
                var hosts = [];
                sdp.split('\r\n').forEach(function(line) { // c.f. http://tools.ietf.org/html/rfc4566#page-39
                    if (~line.indexOf("a=candidate")) { // http://tools.ietf.org/html/rfc4566#section-5.13
                        var parts = line.split(' '), // http://tools.ietf.org/html/rfc5245#section-15.1
                        addr = parts[4], type = parts[7];
                        if (type === 'host')
                            updateDisplay(addr);
                    } else if (~line.indexOf("c=")) { // http://tools.ietf.org/html/rfc4566#section-5.7
                        var parts = line.split(' '), addr = parts[2];
                        updateDisplay(addr);
                    }
                });
            }
        })();
    else {
        document.getElementById('list').innerHTML = "<code>ifconfig | grep inet | grep -v inet6 | cut -d\" \" -f2 | tail -n1</code>";
        document.getElementById('list').nextSibling.textContent = "In Chrome and Firefox your IP should display automatically, by the power of WebRTCskull.";
    }

HTML

<HTML> Your IP:<div id="list"></div></HTML>