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即可

posted @ 2021-12-17 17:39  专职  阅读(3910)  评论(0编辑  收藏  举报