47 lines
970 B
Go
47 lines
970 B
Go
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
|
|
}
|