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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM