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

标签 http go revel

<分区>

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

在 Beego 中:

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

最佳答案

前言:我在我的 github.com/icza/gox 中发布了这个实用程序图书馆,见httpx.ClientIP() .


在 Revel 中也非常相似。 Controller是一个包含 http.Requeststruct ,因此您可以从那里访问 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 字段可能不表示发送请求的原始客户端。通常当请求被转发/通过代理时,原始客户端被添加到一个名为 X-Forwarded-For 的 HTTP header 字段中,您可以像这样

ip := c.Request.Header.Get("X-Forwarded-For")

关于http - 如何在 Go/Revel 中获取客户端 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29236051/

相关文章:

Gorm加载相关数据

go - 如何在 Revel Go Web Framework 中的 App 启动前运行一个函数

php - Google Chrome 对缓存的审核

go - 如何离线获取golang编程之旅

尝试在新创建的目录中创建文件时转到 "permission denied"?

go - 我可以恢复从 slice 开头切掉的元素吗?

api - GAE API 资源管理器不显示 API,似乎卡在加载中

http - jQuery Mobile App + 远程 REST Web 服务 : Alternatives to JSONP?

http - 在帖子正文中发送某些字符时,Web 服务抛出 400 错误请求?

go - 如何调试 revel 构建崩溃日志?