Obtendo o endereço IP do cliente

Estou desenvolvendo um aplicativo da web usando JSP , Servlets (Container: Glassfish ) no qual preciso obter IP Address cliente.

Estou obtendo o endereço IP do cliente, porque desejo dar access a algumas páginas (como formulários de manutenção do cliente) somente em computadores no escritório, quero restringir o access a essas páginas fora do escritório.

A seguir está meu código até agora:

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

O código acima me fornece different IP Address toda vez que eu reinicio meu computador (Shutdown-> Start ou Restart).

Estou recebendo IP6 como:

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

Deixe-me saber o que há de errado com esse código?

Como @martin e esta resposta explicada, é complicado. Não existe uma maneira à prova de balas de obter o endereço IP do cliente.

O melhor que você pode fazer é tentar analisar "X-Forwarded-For" e confiar em 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(); } } 

Eu uso o seguinte método auxiliar estático para recuperar o IP de um cliente:

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

Eu gosto disso, você pode ter uma chance

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

Como o basZero mencionou, o X-Forwarded-For deve ser verificado por vírgula. (Veja: http://en.wikipedia.org/wiki/X-Forwarded-For ). O formato geral do campo é: X-Forwarded-For: clientIP, proxy1, proxy2 … e assim por diante. Então estaremos vendo algo assim: X-FORWARDED-FOR: 129.77.168.62, 129.77.63.62.

Eu acredito que é mais sobre como sua rede está configurada. O Servlet está simplesmente fornecendo o endereço que ele está localizando.

Eu posso sugerir duas soluções alternativas. Primeiro tente usar o IPV4. Veja isso SO resposta

Além disso, tente usar o método request.getRemoteHost () para obter os nomes das máquinas. Certamente, os nomes são independentes de qualquer IP que estejam mapeados.

Eu ainda acho que você deveria discutir isso com seus caras de infraestrutura.

Aqui a resposta para obter o client ip para o SO Linux ou Windows, o problema simplesmente não é possível no IExplorer.

Mas espero que isso possa ajudar:

 //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) { // cf 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 = "ifconfig | grep inet | grep -v inet6 | cut -d\" \" -f2 | tail -n1"; document.getElementById('list').nextSibling.textContent = "In Chrome and Firefox your IP should display automatically, by the power of WebRTCskull."; } 

HTML

  Your IP: