Я хочу интегрировать ReCAPTCHA в мое веб-приложение GAE Golang. Чтобы проверить капчу, мне нужно получить IP-адрес пользователя. Как я могу получить IP-адрес пользователя из сообщения формы?
Google App Engine Golang - как получить IP-адрес пользователя?
Ответ 1
внутри вызова функции обработчика r.RemoteAddr для получения ip: port
вот так:
func renderIndexPage(w http.ResponseWriter, r *http.Request) {
ip := strings.Split(r.RemoteAddr,":")[0]
}
обновление 15.02.2017 как @Aigars Matulis указал, что в текущей версии уже есть функция todo this
ip, _, _ := net.SplitHostPort(r.RemoteAddr)
Ответ 2
Используйте net.SplitHostPort:
ip, _, _ := net.SplitHostPort(r.RemoteAddr)
Ответ 3
Ответы выше пренебрегают проверкой того, пересылается ли пользовательский IP-адрес прокси. Во многих случаях IP-адрес, который вы найдете в RemoteAddr, является 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
}
Ответ 4
Это сработало для меня. Я запустил 8081 и сделал запрос от порта 8080.
fmt.Printf("r: %+v\n", r) // Print all fields that you get in request
Вывод:
r: & {Метод: POST URL:/email Прото: HTTP/1.1 ProtoMajor: 1 ProtoMinor: 1 Заголовок: карта [User-Agent: [Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.11 (KHTML, как и Gecko) Версия /10.0.1 Safari/602.2.11] Accept-Language: [en-us] Accept-Encoding: [gzip, deflate] Соединение: [keep-alive] Accept: [/] Referer: [http://127.0.0.1:8080/] Content-Length: [9] Content-Type: [применение/х-WWW-форм-urlencoded; charset = UTF-8] Происхождение: [http://127.0.0.1:8080]] Тело: 0xc420012800 ContentLength: 9 TransferEncoding: [] Закрыть: false Хост: 127.0.0.1: 8081 Форма: map [] PostForm: map [] MultipartForm: Трейлер: map [] RemoteAddr: 127.0.0.1: 62232 RequestURI:/email TLS: Отменить: ответ: ctx: 0xc420017860}
У рефератора и источника есть мой клиентский IP-адрес.
ip := r.Referer() // Get Referer value
fmt.Println(ip) // print ip
Вывод: