package helper import ( "context" "github.com/go-kratos/kratos/v2/transport/http" "net" "strings" ) // GetHeaderRealIP 获取header头中的真实IP func GetHeaderRealIP(ctx context.Context) string { serverContext, isOk := http.RequestFromServerContext(ctx) if isOk { return serverContext.Header.Get("X-Real-Ip") } return "" } // GetClientIP 获取客户端IP func GetClientIP(r *http.Request) string { xForwardedFor := r.Header.Get("X-Forwarded-For") ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0]) if ip != "" { return ip } ip = strings.TrimSpace(r.Header.Get("X-Real-Ip")) if ip != "" { return ip } if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil { return ip } return "" } // IPString2Long 把ip字符串转为数值(ipv4) func IPString2Long(ip string) uint { b := net.ParseIP(ip).To4() if b == nil { return 0 } return uint(b[3]) | uint(b[2])<<8 | uint(b[1])<<16 | uint(b[0])<<24 }