Получение 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>