提交網(wǎng)站汕頭seo推廣
在一些需求中,服務(wù)器需要記錄客戶端的ip地址,要獲取ip地址,則需要有http.Request的對(duì)象參數(shù)傳入,以下代碼直接放在util中使用。
文件名:ip_utils.go
package utilsimport ("context""github.com/spf13/cast""net""net/http""strings"
)// GetClientRealIp 獲取客戶端的真實(shí) IP 地址
func GetClientRealIp(r *http.Request) (string, bool) {headers := []string{"X-Forwarded-For","Proxy-Client-IP","WL-Proxy-Client-IP","X-Real-Ip",}for _, header := range headers {ip := r.Header.Get(header)if ip != "" {// X-Forwarded-For 可能包含多個(gè) IP 地址,用逗號(hào)分隔,取第一個(gè)有效的ips := strings.Split(ip, ",")for _, ipPart := range ips {ipPart = strings.TrimSpace(ipPart)if isValidIp(ipPart) {return ipPart, true}}}}// 如果沒有獲取到有效的 IP,則返回遠(yuǎn)程地址ip, _, _ := net.SplitHostPort(r.RemoteAddr)return ip, isValidIp(ip)
}// isValidIp 校驗(yàn) IP 地址是否有效
func isValidIp(ip string) bool {return net.ParseIP(ip) != nil
}func GetHeaderAsString(ctx context.Context, key string) (string, bool) {strAny := ctx.Value(key)if strAny != nil {strSlice := cast.ToStringSlice(strAny)if len(strSlice) > 0 {return strSlice[0], true}}return "", false
}
還有一個(gè)需求是,如果還需要獲取客戶端的請(qǐng)求路由,則是
r.URL.Path