golang如何获取客户端ip?


当前第2页 返回上一页

这个方法很简单,就是按照http约定的格式获取,其中X-Forwarded-For和X-Real-Ip header由反向代理填充,例如nginx或 haproxy。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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

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

func ClientPublicIP(r *http.Request) string {

var ip string

for _, ip = range strings.Split(r.Header.Get("X-Forwarded-For"), ",") {

ip = strings.TrimSpace(ip)

if ip != "" && !HasLocalIPddr(ip) {

return ip

}

}

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

if ip != "" && !HasLocalIPddr(ip) {

return ip

}

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

if !HasLocalIPddr(ip) {

return ip

}

}

return ""

}

ClientPublicIP很简单,和ClientIP方法的读取顺序一样,只是试图中X-Forwarded-For列表中找到一个公网ip,如果没有检查X-Real-Ip 是否是一个公网ip,其次检查 http.Request.RemoteAddr 是否是公网ip,如果没有找到公网ip这返回一个空字符串。

这个方法可以让我们有机会优先获取到用户的公网 ip,往往公网 ip 对我们来说更有价值。

推荐教程:《go语言教程》

以上就是golang如何获取客户端ip?的详细内容,更多文章请关注木庄网络博客!!

返回前面的内容

相关阅读 >>

优雅的实现 golang rest api 架构

golang判断是否是素数的方法

2021-03-05:go中,io密集型的应用,比如有很多文件io,磁盘io,网络io,调大goma

golang 架构设计原则 里氏替换原则

go语言基础之变量和常量

一文读懂云原生 go-zero 微服务框架

手撸golang 架构设计原则 接口隔离原则

10 golang map的正确使用姿势

手撸golang 结构型设计模式 组合模式

手撸golang go与微服务 聚合模式之2

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




打赏

取消

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

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

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

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

评论

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