Google App Engine Golang - 如何获取用户的IP地址?

时间:2013-06-20 19:19:29

标签: google-app-engine ip go recaptcha

我想将ReCAPTCHA集成到我的GAE Golang Web应用程序中。为了验证验证码,我需要获取用户的IP地址。如何从表单帖子中获取用户的IP地址?

4 个答案:

答案 0 :(得分:46)

使用net.SplitHostPort

ip, _, _ := net.SplitHostPort(r.RemoteAddr)

答案 1 :(得分:26)

在处理函数内部调用r.RemoteAddr来接收ip:port

像这样:

func renderIndexPage(w http.ResponseWriter, r *http.Request) {
  ip := strings.Split(r.RemoteAddr,":")[0] 

}

更新02/15/2017 正如@Aigars Matulis指出的那样,在当前版本中已经有了一个函数todo this

ip, _, _ := net.SplitHostPort(r.RemoteAddr)

答案 2 :(得分:24)

上述答案忽略了检查用户的IP是否由代理转发。在很多情况下,你会在RemoteAddr中找到的IP是代理的IP,它将用户的请求转发给你 - 而不是用户的IP地址!

更准确的解决方案如下所示:

package main

import (
    "net"
    "net/http"
)

func GetIP(r *http.Request) string {
    if ipProxy := r.Header.Get("X-FORWARDED-FOR"); len(ipProxy) > 0 {
        return ipProxy
    }
    ip, _, _ := net.SplitHostPort(r.RemoteAddr)
    return ip
}

答案 3 :(得分:0)

这对我有用。我在8081运行并从8080端口发出请求。

fmt.Printf("r: %+v\n", r) // Print all fields that you get in request

输出:

  

r:& {方法:POST URL:/ email Proto:HTTP / 1.1 ProtoMajor:1 ProtoMinor:1 Header:map [User-Agent:[Mozilla / 5.0(Macintosh; Intel Mac OS X 10_12_1)AppleWebKit / 602.2 .11(KHTML,和Gecko一样)Version / 10.0.1 Safari / 602.2.11] Accept-Language:[en-us] Accept-Encoding:[gzip,deflate] Connection:[keep-alive]接受:[ / ] Referer:[http://127.0.0.1:8080/] Content-Length:[9] Content-Type:[application / x-www-form-urlencoded; charset = UTF-8]来源:[http://127.0.0.1:8080]]正文:0xc420012800 ContentLength:9 TransferEncoding:[]关闭:false主机:127.0.0.1:8081表格:map [] PostForm:map [] MultipartForm:Trailer:map [ ] RemoteAddr:127.0.0.1:62232 RequestURI:/ email TLS:取消:响应:ctx:0xc420017860}

Referer和Origin拥有我的客户IP。

ip := r.Referer() // Get Referer value
fmt.Println(ip) // print ip

输出:

  

http://127.0.0.1:8080/