我想将ReCAPTCHA集成到我的GAE Golang Web应用程序中。为了验证验证码,我需要获取用户的IP地址。如何从表单帖子中获取用户的IP地址?
答案 0 :(得分:46)
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
输出: