如何在 Go/Revel 中获取客户端 IP 地址
How to get client IP address in Go/Revel
如何在 Revel 中获取客户端的 IP 地址?
在Beego中:
func (this *baseController) getClientIp() string {
s := strings.Split(this.Ctx.Request.RemoteAddr, ":")
return s[0]
}
前言: 我在 github.com/icza/gox
library, see httpx.ClientIP()
.
中发布了这个实用程序
Revel 中也非常相似。 Controller
is a struct
which contains the 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: 如果请求被转发 and/or 通过代理服务器,RemoteAddr
字段可能不表示发送请求的原始客户端要求。通常当一个请求被转发/通过代理时,原始客户端被添加到一个名为 X-Forwarded-For
的 HTTP header 字段中,你可以像
ip := c.Request.Header.Get("X-Forwarded-For")
如何在 Revel 中获取客户端的 IP 地址?
在Beego中:
func (this *baseController) getClientIp() string {
s := strings.Split(this.Ctx.Request.RemoteAddr, ":")
return s[0]
}
前言: 我在 github.com/icza/gox
library, see httpx.ClientIP()
.
Revel 中也非常相似。 Controller
is a struct
which contains the 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: 如果请求被转发 and/or 通过代理服务器,RemoteAddr
字段可能不表示发送请求的原始客户端要求。通常当一个请求被转发/通过代理时,原始客户端被添加到一个名为 X-Forwarded-For
的 HTTP header 字段中,你可以像
ip := c.Request.Header.Get("X-Forwarded-For")