Как получить IP-адрес клиента в Revel?
В Биго:
func (this *baseController) getClientIp() string {
s := strings.Split(this.Ctx.Request.RemoteAddr, ":")
return s[0]
}
Как получить IP-адрес клиента в Revel?
В Биго:
func (this *baseController) getClientIp() string {
s := strings.Split(this.Ctx.Request.RemoteAddr, ":")
return s[0]
}
Предисловие: я добавил эту утилиту в свою библиотеку github.com/icza/gox
, см. httpx.ClientIP()
.
В Ревеле тоже очень похоже. Controller
— это struct
, который содержит http.Request
, поэтому оттуда у вас есть доступ к Request.RemoteAddr
, который используется в приведенном выше примере Beego:
// ctrl is a struct embedding a pointer of github.com/revel/revel.Controller
s := strings.Split(ctrl.Request.RemoteAddr, ":")
ip := s[0]
Или в одну строку:
ip := strings.Split(ctrl.Request.RemoteAddr, ":")[0]
Примечание. Стандартной формы для значения RemoteAddr
не существует. Это может быть адрес IPv4 или IPv6, он может содержать или не содержать порт, поэтому приведенный выше алгоритм (скопированный из вопроса) не будет работать в каждом случае. Вопрос был направлен на то, как получить этот RemoteAddr
, а не на то, как его конкретно разобрать. Чтобы упростить синтаксический анализ адресных строк, используйте net.SplitHostPort()
, например:
host, port, err := net.SplitHostPort(ctrl.Request.RemoteAddr)
Примечание № 2. Если запрос перенаправляется и/или проходит через прокси-серверы, поле RemoteAddr
может не обозначать исходного клиента, отправившего запрос. Обычно, когда запрос пересылается/проходит через прокси, исходный клиент добавляется в поле заголовка HTTP с именем X-Forwarded-For
, которое вы можете получить как
ip := c.Request.Header.Get("X-Forwarded-For")