request.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package utils
  2. import (
  3. "strings"
  4. "github.com/gin-gonic/gin"
  5. )
  6. // GetClientIP 获取客户端 IP 地址(考虑代理情况)
  7. func GetClientIP(c *gin.Context) string {
  8. // 优先从 X-Forwarded-For 获取(适用于代理/负载均衡)
  9. ip := strings.TrimSpace(c.GetHeader("X-Forwarded-For"))
  10. if ip != "" {
  11. return ip
  12. }
  13. // 从 X-Real-IP 获取
  14. ip = strings.TrimSpace(c.GetHeader("X-Real-IP"))
  15. if ip != "" {
  16. return ip
  17. }
  18. return c.ClientIP()
  19. }
  20. // ParseUserAgent 从 User-Agent 字符串中解析浏览器和操作系统
  21. func ParseUserAgent(userAgent string) (browser string, os string) {
  22. browser = "Unknown"
  23. os = "Unknown"
  24. ua := strings.ToLower(userAgent)
  25. if ua == "" {
  26. return
  27. }
  28. switch {
  29. case strings.Contains(ua, "edg/"):
  30. browser = "Edge"
  31. case strings.Contains(ua, "chrome/"):
  32. browser = "Chrome"
  33. case strings.Contains(ua, "firefox/"):
  34. browser = "Firefox"
  35. case strings.Contains(ua, "safari/"):
  36. browser = "Safari"
  37. }
  38. switch {
  39. case strings.Contains(ua, "windows nt"):
  40. os = "Windows"
  41. case strings.Contains(ua, "mac os x") || strings.Contains(ua, "macintosh"):
  42. os = "macOS"
  43. case strings.Contains(ua, "android"):
  44. os = "Android"
  45. case strings.Contains(ua, "iphone") || strings.Contains(ua, "ipad"):
  46. os = "iOS"
  47. case strings.Contains(ua, "linux"):
  48. os = "Linux"
  49. }
  50. return
  51. }