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即可
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· spring官宣接入deepseek,真的太香了~