Maison  >  Article  >  développement back-end  >  Comment obtenir l'adresse IP du client à Golang ?

Comment obtenir l'adresse IP du client à Golang ?

coldplay.xixi
coldplay.xixioriginal
2020-06-20 10:13:304950parcourir

Comment obtenir l'adresse IP du client à Golang ?

Comment obtenir l'IP du client dans Golang ?

Méthode de Golang pour obtenir l'IP du client :

La méthode ClientIP est similaire à la méthode ClientPublicIP, sauf qu'elle obtient l'IP du client selon le http protocole d'accord. Recherchez l'adresse IP publique selon le format convenu.

Dans un environnement avec une architecture de réseau et de service et une logique métier complexes, il n'est pas toujours possible d'obtenir la véritable adresse IP selon la méthode convenue dans le protocole http. Dans notre métier, le trafic des utilisateurs est acheminé via trois parties. à plusieurs niveaux (tous (client http) mis en œuvre par les trois parties elles-mêmes, il y aura inévitablement des défauts. À l'heure actuelle, il sera plus difficile pour les futurs services d'obtenir la véritable adresse IP de l'utilisateur. Vous ne savez même pas si le L'IP que vous avez obtenue est réelle.

Cependant, le trafic acheminé par nos clients via trois parties, la plupart des clients sont donc des utilisateurs du réseau public, même en excluant le test. La combinaison des méthodes ClientPublicIP et ClientIP permet toujours de mieux obtenir la véritable adresse IP de l'utilisateur

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

L'utilisation de la méthode ci-dessus peut toujours obtenir efficacement la véritable adresse IP de l'utilisateur. Analysons la mise en œuvre spécifique des deux méthodes.

// 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 ""
}

ClientIP lit d'abord la première adresse IP séparée par, dans l'en-tête X-Forwarded-For. Si cette adresse n'existe pas, elle sera récupérée depuis X-Real-Ip. En-tête Obtenir, s'il n'existe toujours pas, cela signifie que le trafic n'est pas transmis par le proxy inverse, mais que le client demande directement le service. À ce moment, l'adresse IP moins le numéro de port est interceptée via http.Request. Champ .RemoteAddr.

Cette méthode est très simple, elle est obtenue selon le format de convention http, où les en-têtes X-Forwarded-For et X-Real-Ip sont renseignés par un proxy inverse, tel que nginx ou haproxy.

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

ClientPublicIP est très simple. L'ordre de lecture de la méthode ClientIP est le même. Il essaie simplement de trouver une adresse IP de réseau public dans la liste X-Forwarded-For. -Ip est une adresse IP de réseau public, et vérifiez ensuite si http.Request.RemoteAddr est une adresse IP de réseau public. Si l'adresse IP du réseau public n'est pas trouvée, une chaîne vide est renvoyée.

Cette méthode nous donne la possibilité d'obtenir en premier l'adresse IP publique de l'utilisateur. L'adresse IP publique est souvent plus précieuse pour nous.

Tutoriel recommandé : "tutoriel de langue go"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn