Heim  >  Artikel  >  Backend-Entwicklung  >  Wie bekomme ich die Client-IP in Golang?

Wie bekomme ich die Client-IP in Golang?

coldplay.xixi
coldplay.xixiOriginal
2020-06-20 10:13:305007Durchsuche

Wie bekomme ich die Client-IP in Golang?

Wie erhalte ich die Client-IP in Golang?

Golangs Methode zum Abrufen der Client-IP:

Die ClientIP-Methode ähnelt der ClientPublicIP-Methode, außer dass sie die Client-IP gemäß http erhält Protokollvereinbarung. Finden Sie die öffentliche IP-Adresse gemäß dem vereinbarten Format.

In einer Umgebung mit komplexer Netzwerk- und Servicearchitektur und Geschäftslogik ist es nicht immer möglich, die echte IP gemäß der im http-Protokoll vereinbarten Methode zu erhalten. In unserem Unternehmen wird der Benutzerverkehr über drei Parteien weitergeleitet Auf mehreren Ebenen (alle (http-Client), die von den drei Parteien selbst implementiert werden, treten zwangsläufig einige Mängel auf. Zu diesem Zeitpunkt wird es für zukünftige Dienste schwieriger sein, die tatsächliche IP des Benutzers abzurufen. Sie wissen nicht einmal, ob das der Fall ist Die von Ihnen erhaltene IP ist echt.

Da der Datenverkehr unserer Kunden jedoch über drei Parteien weitergeleitet wird, sind die meisten Kunden öffentliche Netzwerkbenutzer, selbst wenn man den Test ausschließt. Durch die Kombination der ClientPublicIP- und ClientIP-Methoden kann die tatsächliche IP des Benutzers immer besser ermittelt werden

Mit der oben genannten Methode können Sie immer effektiv die tatsächliche IP-Adresse des Benutzers ermitteln. Lassen Sie uns die spezifische Implementierung der beiden Methoden analysieren.

// var r *http.Request
ip := exnet.ClientPublicIP(r)
if ip == ""{
  ip = exnet.ClientIP(r)
}

ClientIP liest zuerst die erste IP-Adresse, getrennt durch, im X-Forwarded-For-Header. Wenn diese Adresse nicht existiert, wird sie von der X-Real-IP abgerufen Wenn der Header immer noch nicht vorhanden ist, bedeutet dies, dass der Datenverkehr nicht vom Reverse-Proxy weitergeleitet wird, sondern dass der Client den Dienst zu diesem Zeitpunkt direkt über http.Request abfängt .RemoteAddr-Feld.

Diese Methode ist sehr einfach. Sie erfolgt gemäß dem HTTP-Konventionsformat, bei dem die Header X-Forwarded-For und X-Real-Ip von einem Reverse-Proxy wie Nginx oder ausgefüllt werden haproxy.

// ClientIP 尽最大努力实现获取客户端 IP 的算法。
// 解析 X-Real-IP 和 X-Forwarded-For 以便于反向代理(nginx 或 haproxy)可以正常工作。
func ClientIP(r *http.Request) string {
xForwardedFor := r.Header.Get("X-Forwarded-For")
ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0])
if ip != "" {
return ip
}
ip = strings.TrimSpace(r.Header.Get("X-Real-Ip"))
if ip != "" {
return ip
}
if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
return ip
}
return ""
}

ClientPublicIP ist sehr einfach. Die Lesereihenfolge ist dieselbe wie bei der ClientIP-Methode. Es wird lediglich versucht, eine öffentliche Netzwerk-IP in der X-Forwarded-For-Liste zu finden -Ip ist eine öffentliche Netzwerk-IP und prüft zweitens, ob http.Request.RemoteAddr eine öffentliche IP ist. Wenn die öffentliche IP nicht gefunden wird, wird eine leere Zeichenfolge zurückgegeben.

Diese Methode gibt uns die Möglichkeit, zuerst die öffentliche IP des Benutzers zu erhalten, und oft ist die öffentliche IP für uns wertvoller.

Empfohlenes Tutorial: „

Gehe zum Sprachtutorial

Das obige ist der detaillierte Inhalt vonWie bekomme ich die Client-IP in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn