Как получить IP-адрес клиента в Go/Revel

Как получить IP-адрес клиента в Revel?

В Биго:

func (this *baseController) getClientIp() string {
    s := strings.Split(this.Ctx.Request.RemoteAddr, ":")
    return s[0]
}

person Nilton OS    schedule 24.03.2015    source источник


Ответы (1)


Предисловие: я добавил эту утилиту в свою библиотеку 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")
person icza    schedule 24.03.2015
comment
Request.RemoteAddr возвращает 127.0.0.1 - person Nilton OS; 24.03.2015
comment
Вернуть реальный IP-адрес: = c.Request.Header.Get (X-Forwarded-For) - person Nilton OS; 24.03.2015
comment
Добавить Utils GetIp github.com/zzdboy/GoCMS /blob/master/app/controllers/Пользователь/ - person Nilton OS; 24.03.2015
comment
Ответ следует изменить на то, что ответил @NiltonOS, вышеприведенное не работает. - person JazzCat; 02.04.2017