2

Howto get the client's IP Address in Revel?

In Beego:

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

1 回答 1

6

前言:我在我的github.com/icza/gox库中发布了这个实用程序,请参阅httpx.ClientIP().


在 Revel 中也非常相似。TheController是一个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")
于 2015-03-24T15:27:52.907 回答