golang獲取客戶端ip的實(shí)現(xiàn)
網(wǎng)絡(luò)上的答案獲取的ip是服務(wù)器的ip或者獲取本地ip,然后通過(guò)ip獲取詳細(xì)地址,要么報(bào)錯(cuò),要么或者客戶端的位置不正確…直接給我整麻了~
網(wǎng)絡(luò)答案:
獲取局域網(wǎng)ip
func GetOutBoundIP() (ip string, err error) {
conn, err := net.Dial("udp", "8.8.8.8:53")
if err != nil {
fmt.Println(err)
return
}
localAddr := conn.LocalAddr().(*net.UDPAddr)
ip = strings.Split(localAddr.String(), ":")[0]
return
}獲取外網(wǎng)能訪問(wèn)的動(dòng)態(tài)ip,獲取的是本機(jī)的ip不是客戶端的ip
func GetOutBoundIP(ctx iris.Context) (ip string, err error) {
resp, err := http.Get("http://myexternalip.com/raw")
if err != nil {
return "",err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
ip = string(body)
return
}后來(lái)發(fā)現(xiàn)以上都不適合或者客戶端ip
獲取客戶端ip
//通過(guò)iris的context內(nèi)部函數(shù)獲取請(qǐng)求頭部獲取ip
func GetOutBoundIP(ctx iris.Context) (string, error) {
?? ?//從請(qǐng)求頭部的X-REAL-IP獲取Ip
?? ?ip := ctx.Request().Header.Get("X-REAL-IP")
?? ?netIP := net.ParseIP(ip)
?? ?if netIP != nil {
?? ??? ?return ip, nil
?? ?}
?? ?//從請(qǐng)求頭部的X-FORWARDED-FOR獲取Ip
?? ?ips := ctx.Request().Header.Get("X-FORWARDED-FOR")
?? ?splitIps := strings.Split(ips, ",")
?? ?for _, ip := range splitIps {
?? ??? ?netIP := net.ParseIP(ip)
?? ??? ?if netIP != nil {
?? ??? ??? ?return ip, nil
?? ??? ?}
?? ?}
?? ?//從請(qǐng)求頭部的RemoteAddr獲取Ip
?? ?ip, _, err := net.SplitHostPort(ctx.Request().RemoteAddr)
?? ?if err != nil {
?? ??? ?return "", err
?? ?}
?? ?netIP = net.ParseIP(ip)
?? ?if netIP != nil {
?? ??? ?return ip, nil
?? ?}
?? ?return "", fmt.Errorf("正確ip獲取失敗")
}到此這篇關(guān)于golang獲取客戶端ip的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang獲取客戶端ip內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言使用Swiss Table實(shí)現(xiàn)更快的map
wiss Table 是一種高效的哈希表實(shí)現(xiàn),最初由 Google 在 C++ 中引入,后來(lái)也被其他語(yǔ)言(如 Rust)采用,下面我們看看如何使用 Swiss Table 的思想來(lái)實(shí)現(xiàn)一個(gè)更快的 Go map2025-03-03
Go語(yǔ)言使用Buffer實(shí)現(xiàn)高性能處理字節(jié)和字符
在?Go?中,bytes.Buffer?是一個(gè)非常高效的類型,用于處理字節(jié)數(shù)據(jù)的讀寫操作,本文將詳細(xì)介紹一下如何使用Buffer實(shí)現(xiàn)高性能處理字節(jié)和字符,有需要的小伙伴可以了解下2025-01-01
Go語(yǔ)言LeetCode題解961在長(zhǎng)度2N的數(shù)組中找出重復(fù)N次元素
這篇文章主要為大家介紹了Go語(yǔ)言LeetCode題解961在長(zhǎng)度2N的數(shù)組中找出重復(fù)N次元素示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
golang DNS服務(wù)器的簡(jiǎn)單實(shí)現(xiàn)操作
這篇文章主要介紹了golang DNS服務(wù)器的簡(jiǎn)單實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
Golang中Channel實(shí)戰(zhàn)技巧與一些說(shuō)明
channel是Go語(yǔ)言內(nèi)建的first-class類型,也是Go語(yǔ)言與眾不同的特性之一,下面這篇文章主要給大家介紹了關(guān)于Golang中Channel實(shí)戰(zhàn)技巧與一些說(shuō)明的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的并發(fā)網(wǎng)頁(yè)爬蟲示例
在這個(gè)章節(jié)中,我們將會(huì)結(jié)合之前的知識(shí)點(diǎn),實(shí)現(xiàn)一個(gè)簡(jiǎn)易的并發(fā)網(wǎng)頁(yè)爬蟲,我們的爬蟲會(huì)先爬取一個(gè)起始頁(yè)面,提取出所有的鏈接,然后并發(fā)地爬取這些鏈接,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-08-08
Golang 的defer執(zhí)行規(guī)則說(shuō)明
這篇文章主要介紹了Golang 的defer執(zhí)行規(guī)則說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04

