golang如何获取客户端ip?


本文摘自php中文网,作者coldplay.xixi,侵删。

golang如何获取客户端ip?

golang获取客户端ip的方法:

ClientIP方法与ClientPublicIP方法的实现类似,只是一个按照http协议约定获取客户端ip, 一个按照约定格式查找到公网ip。

在网络与服务架构、业务逻辑复杂的环境中,按照http协议约定的方式,并非总能获取到真实的ip,在我们的业务中用户流量经由三方多层级转发(都是三方自己实现的http client) ,难免会出现一些纰漏,这时越往后的服务获取用户真实ip越加困难,你甚至不知道自己获取的ip是否是真实的。

但是我们的客户经由三方转发而来的流量,那么客户极大多数甚至排除测试之外都是公网用户,结合使用 ClientPublicIP 和 ClientIP 方法总能更好的获取用户的真实ip

1

2

3

4

5

// var r *http.Request

ip := exnet.ClientPublicIP(r)

if ip == ""{

  ip = exnet.ClientIP(r)

}

用上面的方法总能有效的获取用户真实的ip地址,下面分析下两个方法的具体实现。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

// ClientIP 尽最大努力实现获取客户端 IP 的算法。

// 解析 X-Real-IP 和 X-Forwarded-For 以便于反向代理(nginx 或 haproxy)可以正常工作。

func ClientIP(r *http.Request) string {

xForwardedFor := r.Header.Get("X-Forwarded-For")

ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0])

if ip != "" {

return ip

}

ip = strings.TrimSpace(r.Header.Get("X-Real-Ip"))

if ip != "" {

return ip

}

if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {

return ip

}

return ""

}

ClientIP首先读取X-Forwarded-For header中用 , 分隔的第一个ip地址,如果这个地址不存在,就会从X-Real-Ip header中获取,如果还是不存在,说明流量并非是由反向代理转发而来,而是客户端直接请求服务,这时通过http.Request.RemoteAddr字段截取除去端口号的ip地址。

阅读剩余部分

相关阅读 >>

05 golang内置的运算符

手撸golang 仿spring ioc/aop 之11 增强2

golang 怎么调用c代码

go语言操作数据库及其常规操作

golang的压测工具 hey

golang的优势在哪里

go操作mysql

go学习五·切片

golang错误抛出的方法

手撸golang 行为型设计模式 模板方法模式

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...