package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
gin.SetMode("release") // 設置為生產模式
r := gin.Default()
r.SetTrustedProxies([]string{"172.19.10.12"}) // 設置受信任代理,如果不設置默認信任所有代理,不安全
r.GET("/ping", func(c *gin.Context) {
// RemoteIP() 無代理返回客戶端IP,有代理返回代理IP
fmt.Println(c.RemoteIP())
// ClientIP() 無論是否有代理,都會返回客戶端IP
// 如果有代理的情況下,代理需要添加header頭,X-Real-IP或X-Forwarded-IP
// 當然也有個前提條件,代理IP必須已經加入到了受信任的代理中了,否則只會返回代理IP,不會返回客戶端IP
fmt.Println(c.ClientIP())
c.JSON(200, gin.H{
"message": "go語言中文文檔www.topgoer.com",
})
})
r.Run("172.19.10.13:8080") // listen and serve on 0.0.0.0:8080
}
獲取客戶端真實IP升級版,自定義真實IP存在的請求頭
package main
import (
"github.com/gin-gonic/gin"
"log"
)
func main() {
//gin.SetMode(gin.ReleaseMode) // 生產模式使用
r := gin.Default()
// 自定義請求頭中設置的用戶的真實Ip地址
r.TrustedPlatform = "Client-IP"
err := r.SetTrustedProxies([]string{"192.168.110.10"})
if err != nil {
log.Fatal("設置信任的代理失敗")
}
r.GET("/index", func(context *gin.Context) {
// ClientIP 實現了一種盡力而為的算法來返回真實的客戶端 IP。它在后台調用 c.RemoteIP() 來檢查遠程 IP
//是否是受信任的代理。如果是,它將嘗試解析 Engine.RemoteIPHeaders 中定義的標頭
//(默認為 [X-Forwarded-For, X-Real-Ip])。如果標頭在語法上無效或遠程 IP 不對應於受信任的代理,
//則返回遠程 IP(來自 Request.RemoteAddr)
// 如果X-Forwarded-For和X-Real-Ip都設置了,會優先使用X-Forwarded-For
log.Println("用戶的真實IP是:", context.ClientIP())
context.JSON(200, gin.H{"msg": "success"})
})
err = r.Run(":8000")
if err != nil {
log.Fatal("服務啟動失敗...")
}
log.Println("服務啟動成功", "0.0.0.0:8000")
}
注意:測試的時候在請求頭里加上Client-IP即可
