Ottenere l’indirizzo IP del client

Sto sviluppando un’applicazione web usando JSP , Servlets (Container: Glassfish ) in cui ho bisogno di ottenere l’ IP Address client.

Ricevo l’indirizzo IP del client, perché voglio dare accesso ad alcune pagine (come i moduli di manutenzione del cliente) solo sui computer in ufficio, voglio limitare l’accesso a quelle pagine fuori dall’ufficio.

Di seguito è riportato il mio codice finora:

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

Sopra il codice mi dà different IP Address ogni volta che riavvio il mio computer (Shutdown-> Start o Restart).

IP6 come:

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

Fammi sapere cosa c’è di sbagliato in questo codice?

Come @martin e questa risposta ha spiegato, è complicato. Non esiste un modo a prova di proiettile per ottenere l’indirizzo IP del client.

Il meglio che puoi fare è provare ad analizzare "X-Forwarded-For" e fare affidamento su 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(); } } 

Io uso il seguente metodo di supporto statico per recuperare l’IP di 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; } 

Mi piace, puoi provare

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

Come menzionato basZero, X-Forwarded-For dovrebbe essere controllato per la virgola. (Guarda: http://en.wikipedia.org/wiki/X-Forwarded-Per ). Il formato generale del campo è: X-Forwarded-For: clientIP, proxy1, proxy2 … e così via. Quindi vedremo qualcosa di simile: X-FORWARDED-FOR: 129.77.168.62, 129.77.63.62.

Credo che dipenda più da come è configurata la tua rete. Servlet ti sta semplicemente dando l’indirizzo che sta cercando.

Posso suggerire due soluzioni alternative. Prima prova a usare IPV4. Vedi questa risposta SO

Inoltre, provare a utilizzare il metodo request.getRemoteHost () per ottenere i nomi delle macchine. Sicuramente i nomi sono indipendenti dall’IP cui sono mappati.

Continuo a pensare che dovresti discuterne con i tuoi ragazzi dell’infrastruttura.

Ecco la risposta per ottenere l’IP del client per OS Linux o Windows, il problema non è ansible su IExplorer.

Ma spero che questo possa aiutare:

 //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: