From 18b8c4c18bc677905f18c6db2d434b27eb46a7e1 Mon Sep 17 00:00:00 2001 From: Odboy Date: Fri, 12 Jun 2026 21:17:12 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AE=A2=E6=88=B7=E7=AB=AF=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=E4=B8=8A=E6=8A=A5=20IP=20=E5=9C=B0=E5=9D=80=E4=BC=98?= =?UTF-8?q?=E5=85=88=E4=BD=BF=E7=94=A8=20IPv4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 getClientIP 辅助函数,将 IPv6 环回地址(::1)转为 127.0.0.1, 避免在线客户端列表显示 IPv6 地址。 --- server/internal/handler/config_api.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/server/internal/handler/config_api.go b/server/internal/handler/config_api.go index b4503a3..07c9642 100644 --- a/server/internal/handler/config_api.go +++ b/server/internal/handler/config_api.go @@ -6,6 +6,7 @@ import ( "kenaito-conf/server/internal/logger" "kenaito-conf/server/internal/model" "kenaito-conf/server/internal/service" + "net" "net/http" "strconv" "time" @@ -13,6 +14,25 @@ import ( "github.com/gin-gonic/gin" ) +// getClientIP 获取客户端 IPv4 地址,将 IPv6 环回地址转为 127.0.0.1 +func getClientIP(c *gin.Context) string { + ip := c.ClientIP() + if ip == "" { + return "" + } + parsed := net.ParseIP(ip) + if parsed == nil { + return ip + } + if parsed.IsLoopback() { + return "127.0.0.1" + } + if v4 := parsed.To4(); v4 != nil { + return v4.String() + } + return ip +} + type ConfigApiHandler struct { parseService *service.ConfigParseService } @@ -107,7 +127,7 @@ func (h *ConfigApiHandler) FetchAllConfigs(c *gin.Context) { result["latest.fetch.timestamp"] = strconv.FormatInt(time.Now().UnixMilli(), 10) // record client instances asynchronously - go h.recordClientInstances(c.ClientIP(), configIds, req.AppName, req.Env, "fetchAll") + go h.recordClientInstances(getClientIP(c), configIds, req.AppName, req.Env, "fetchAll") c.JSON(http.StatusOK, result) } @@ -197,7 +217,7 @@ func (h *ConfigApiHandler) FetchChangedConfigs(c *gin.Context) { if len(configIds) > 0 { fetchType = "fetchChanged" } - go h.recordClientInstances(c.ClientIP(), allConfigIds, req.AppName, req.Env, fetchType) + go h.recordClientInstances(getClientIP(c), allConfigIds, req.AppName, req.Env, fetchType) c.JSON(http.StatusOK, model.WrapperResponse{Code: 0, Data: result}) }