真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語(yǔ)言獲取客戶(hù)端ip的方法

這篇文章將為大家詳細(xì)講解有關(guān)go語(yǔ)言獲取客戶(hù)端ip的方法,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)公司技術(shù)團(tuán)隊(duì)十余年來(lái)致力于為客戶(hù)提供成都網(wǎng)站制作、做網(wǎng)站、高端網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過(guò)多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了成百上千家網(wǎng)站,包括各類(lèi)中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。

ClientIP方法與ClientPublicIP方法的實(shí)現(xiàn)類(lèi)似,只是一個(gè)按照http協(xié)議約定獲取客戶(hù)端ip, 一個(gè)按照約定格式查找到公網(wǎng)ip。

在網(wǎng)絡(luò)與服務(wù)架構(gòu)、業(yè)務(wù)邏輯復(fù)雜的環(huán)境中,按照http協(xié)議約定的方式,并非總能獲取到真實(shí)的ip,在我們的業(yè)務(wù)中用戶(hù)流量經(jīng)由三方多層級(jí)轉(zhuǎn)發(fā)(都是三方自己實(shí)現(xiàn)的http client) ,難免會(huì)出現(xiàn)一些紕漏,這時(shí)越往后的服務(wù)獲取用戶(hù)真實(shí)ip越加困難,你甚至不知道自己獲取的ip是否是真實(shí)的。

但是我們的客戶(hù)經(jīng)由三方轉(zhuǎn)發(fā)而來(lái)的流量,那么客戶(hù)極大多數(shù)甚至排除測(cè)試之外都是公網(wǎng)用戶(hù),結(jié)合使用 ClientPublicIP 和 ClientIP 方法總能更好的獲取用戶(hù)的真實(shí)ip

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

用上面的方法總能有效的獲取用戶(hù)真實(shí)的ip地址,下面分析下兩個(gè)方法的具體實(shí)現(xiàn)。

// ClientIP 盡最大努力實(shí)現(xiàn)獲取客戶(hù)端 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首先讀取X-Forwarded-For header中用 , 分隔的第一個(gè)ip地址,如果這個(gè)地址不存在,就會(huì)從X-Real-Ip header中獲取,如果還是不存在,說(shuō)明流量并非是由反向代理轉(zhuǎn)發(fā)而來(lái),而是客戶(hù)端直接請(qǐng)求服務(wù),這時(shí)通過(guò)http.Request.RemoteAddr字段截取除去端口號(hào)的ip地址。

這個(gè)方法很簡(jiǎn)單,就是按照http約定的格式獲取,其中X-Forwarded-For和X-Real-Ip header由反向代理填充,例如nginx或 haproxy。

// ClientPublicIP 盡最大努力實(shí)現(xiàn)獲取客戶(hù)端公網(wǎng) 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很簡(jiǎn)單,和ClientIP方法的讀取順序一樣,只是試圖中X-Forwarded-For列表中找到一個(gè)公網(wǎng)ip,如果沒(méi)有檢查X-Real-Ip 是否是一個(gè)公網(wǎng)ip,其次檢查 http.Request.RemoteAddr 是否是公網(wǎng)ip,如果沒(méi)有找到公網(wǎng)ip這返回一個(gè)空字符串。

這個(gè)方法可以讓我們有機(jī)會(huì)優(yōu)先獲取到用戶(hù)的公網(wǎng) ip,往往公網(wǎng) ip 對(duì)我們來(lái)說(shuō)更有價(jià)值。

關(guān)于go語(yǔ)言獲取客戶(hù)端ip的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


本文名稱(chēng):go語(yǔ)言獲取客戶(hù)端ip的方法
標(biāo)題路徑:http://weahome.cn/article/poedpp.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部