etcb.cn etcb.cn

欢迎光临
我们一直在努力
顶部
域名
云服务器48/月

golang获取客户端ip的实现_Golang_

网络上的答案获取的ip是服务器的ip或者获取本地ip,然后通过ip获取详细地址,要么报错,要么或者客户端的位置不正确…直接给我整麻了~

网络答案:

获取局域网ip

func GetOutBoundIP() (ip string, err error) {
    conn, err := net.Dial("udp", "8.8.8.8:53")
    if err != nil {
        fmt.Println(err)
        return
    }
    localAddr := conn.LocalAddr().(*net.UDPAddr)
    ip = strings.Split(localAddr.String(), ":")[0]
    return
}

获取外网能访问的动态ip,获取的是本机的ip不是客户端的ip

func GetOutBoundIP(ctx iris.Context) (ip string, err error) {
    resp, err := http.Get("http://myexternalip.com/raw")
    if err != nil {
        return "",err
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    ip = string(body)
    return
}

后来发现以上都不适合或者客户端ip

获取客户端ip

//通过iris的context内部函数获取请求头部获取ip
func GetOutBoundIP(ctx iris.Context) (string, error) {
    //从请求头部的X-REAL-IP获取Ip
    ip := ctx.Request().Header.Get("X-REAL-IP")
    netIP := net.ParseIP(ip)
    if netIP != nil {
        return ip, nil
    }
    //从请求头部的X-FORWARDED-FOR获取Ip
    ips := ctx.Request().Header.Get("X-FORWARDED-FOR")
    splitIps := strings.Split(ips, ",")
    for _, ip := range splitIps {
        netIP := net.ParseIP(ip)
        if netIP != nil {
            return ip, nil
        }
    }
    //从请求头部的RemoteAddr获取Ip
    ip, _, err := net.SplitHostPort(ctx.Request().RemoteAddr)
    if err != nil {
        return "", err
    }
    netIP = net.ParseIP(ip)
    if netIP != nil {
        return ip, nil
    }
    return "", fmt.Errorf("正确ip获取失败")
}

到此这篇关于golang获取客户端ip的实现的文章就介绍到这了,更多相关golang获取客户端ip内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。
发布内容
-六神源码网 -六神源码网