如何在Go/Revel中获取客户端IP地址

Nil*_* OS 1 go revel

如何在Revel中获取客户端的IP地址?

在Beego:

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

icz*_*cza 5

它在Revel中也非常相似.这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]
Run Code Online (Sandbox Code Playgroud)

或者在一行中:

ip := strings.Split(ctrl.Request.RemoteAddr, ":")[0]
Run Code Online (Sandbox Code Playgroud)

注意:没有标准形式的值RemoteAddr.它可以是IPv4或IPv6地址,它可能包含也可能不包含端口,因此上述算法(从问题中复制)在每种情况下都不起作用.问题是针对如何获得这个RemoteAddr而不是如何解析它.要轻松解析地址字符串,请使用net.SplitHostPort(),如:

host, port, err := net.SplitHostPort(ctrl.Request.RemoteAddr)
Run Code Online (Sandbox Code Playgroud)

注意#2:如果请求被转发和/或通过代理服务器,则该RemoteAddr字段可能不表示发送请求的原始客户端.通常当请求被转发/通过代理时,原始客户端被添加到一个名为的HTTP头字段中X-Forwarded-For,您可以这样做

ip := c.Request.Header.Get("X-Forwarded-For")
Run Code Online (Sandbox Code Playgroud)