Получение 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 каждый раз, когда я перезагружаю компьютер (Завершение работы -> Пуск или Перезагрузка).

я получаю IP6 лайк:

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

Дайте мне знать, что не так с этим кодом?

5 ответов

Как объяснил @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();
    }
}

Я использую следующий статический вспомогательный метод для получения 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;  
}

Я делаю так, вы можете попробовать

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

Как упомянуто 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.

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

Я могу предложить два обходных пути. Сначала попробуйте использовать IPV4. Смотрите этот ТАК Ответ

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

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

Здесь ответ, чтобы получить 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>
Другие вопросы по тегам