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

Go语言获取客户端真实IP

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

文件名:ip_utils.go

package utils

import (
	"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.kler.cn/a/408554.html

相关文章:

  • Vite基本概要
  • 图形化界面MySQL(MySQL)(超级详细)
  • 【tensorflow的安装步骤】
  • 量子卷积神经网络
  • web-03
  • 洛谷 P1722 矩阵 II C语言 记忆化搜索
  • PowerMILL 客制化宏 - 概念
  • 功能强大的stringstream类
  • Kotlin Multiplatform 未来将采用基于 JetBrains Fleet 定制的独立 IDE
  • STM32定时器原理及应用
  • Spring 框架环境搭建
  • 改错题总结
  • 6-自定义fprint函数 --github_com_fatih_color测试
  • 【初阶数据结构与算法】线性表之队列的定义与实现
  • HarmonyOS:使用ArkWeb构建页面
  • 手搓《unordered_map unordered_set》
  • 《第十部分》1.STM32之通信接口《精讲》之IIC通信---介绍
  • 用 BlockingQueue 打造轻量级消息队列服务:从原理到实现
  • [Docker-显示所有容器IP] 显示docker-compose.yml中所有容器IP的方法
  • 本地推流,服务器拉流全流程
  • SCP文件传输命令解析
  • C++:用红黑树封装map与set-1
  • 前端:JavaScript (学习笔记)【2】
  • 每日计划-1124
  • 嵌入式Linux——文件类型
  • 【jvm】java对象的访问定位