当前位置: 首页 > news >正文

Go语言获取客户端真实IP

在一些需求中,服务器需要记录客户端的ip地址,要获取ip地址,则需要有http.Request的对象参数传入,以下代码直接放在util中使用。

文件名:ip_utils.go

package utilsimport ("context""github.com/spf13/cast""net""net/http""strings"
)// GetClientRealIp 获取客户端的真实 IP 地址
func GetClientRealIp(r *http.Request) (string, bool) {headers := []string{"X-Forwarded-For","Proxy-Client-IP","WL-Proxy-Client-IP","X-Real-Ip",}for _, header := range headers {ip := r.Header.Get(header)if ip != "" {// X-Forwarded-For 可能包含多个 IP 地址,用逗号分隔,取第一个有效的ips := strings.Split(ip, ",")for _, ipPart := range ips {ipPart = strings.TrimSpace(ipPart)if isValidIp(ipPart) {return ipPart, true}}}}// 如果没有获取到有效的 IP,则返回远程地址ip, _, _ := net.SplitHostPort(r.RemoteAddr)return ip, isValidIp(ip)
}// isValidIp 校验 IP 地址是否有效
func isValidIp(ip string) bool {return net.ParseIP(ip) != nil
}func GetHeaderAsString(ctx context.Context, key string) (string, bool) {strAny := ctx.Value(key)if strAny != nil {strSlice := cast.ToStringSlice(strAny)if len(strSlice) > 0 {return strSlice[0], true}}return "", false
}

还有一个需求是,如果还需要获取客户端的请求路由,则是

r.URL.Path

http://www.lryc.cn/news/491362.html

相关文章:

  • 大模型论文速递(11.23-11.25)
  • 维护在线重做日志(二)
  • .net core MVC入门(一)
  • 802.11协议
  • 【Linux】线程ID与互斥、同步(锁、条件变量)
  • Android 13 编译Android Studio版本的Launcher3
  • burp功能介绍
  • Android12 的 Vold梳理
  • [pdf,epub]162页《分析模式》漫谈合集01-35提供下载
  • Vue2教程003:Vue指令之v-bind和v-for
  • Pathlib操作文件IN Python
  • AOC显示器915Sw按键失灵维修记
  • 霍曼转移方法介绍
  • 我的创作之路:机缘、收获、日常与未来的憧憬
  • 《硬件架构的艺术》笔记(六):处理字节顺序
  • AddIPAddress添加临时IP后,socket bind失败
  • 关于IDE的相关知识之一【使用技巧】
  • 线性代数在人工智能领域中的实践
  • 图片生成视频-右进
  • 3、集线器、交换机、路由器、ip的关系。
  • w~视觉~合集25
  • Applicaiton配置文件
  • (已解决)wps无法加载此加载项程序mathpage.wll
  • ubity3D基础
  • Python2和Python3的区别
  • Spring框架整合单元测试
  • docker-mysql
  • Java程序基础⑤Java数组的定义和使用+引用的概念
  • electron主进程和渲染进程之间的通信
  • uniapp 安卓和ios震动方法,支持息屏和后台震动,ios和安卓均通过测试