gin框架中设置信任代理IP并获取远程客户端IP
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即可