如何在Revel中获取客户端的IP地址?
在Beego:
func (this *baseController) getClientIp() string {
s := strings.Split(this.Ctx.Request.RemoteAddr, ":")
return s[0]
}
答案 0 :(得分:5)
它在Revel中也非常相似。 Controller
是struct
,其中包含http.Request
,因此您可以访问上面的Beego示例中使用的Request.RemoteAddr
:
// 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
字段可能不表示发送请求的原始客户端。通常,当请求被转发/通过代理时,原始客户端将添加到名为X-Forwarded-For
的HTTP头字段中,您可以将其添加到
ip := c.Request.Header.Get("X-Forwarded-For")