ASP.NET 获取客户端外网IP地址

我们用 Request.ServerVariables( "REMOTE_ADDR ")   来取得客户端的IP地址。但是,如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真正的客户端IP地址。要想透过代理服务器取得客户端的真实IP地址,就要使用   Request.ServerVariables( "HTTP_X_FORWARDED_FOR ")   来读取。

要注意的是:并不是每个代理服务器都能用   Request.ServerVariables( "HTTP_X_FORWARDED_FOR ")   来读取客户端的真实IP,有些用此方法读取到的仍然是代理服务器的IP。如果客户端没有通过代理服务器来访问,那么用   Request.ServerVariables   ( "HTTP_X_FORWARDED_FOR ")   取到的值将是空的。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Configuration;
  4. using System.Linq;
  5. using System.IO;
  6. using System.Net;
  7. using System.Web;
  8. using System.Web.UI;
  9. using System.Web.UI.WebControls;
  10. using System.Text;
  11. using System.Text.RegularExpressions;

  12.         /// <summary>
  13.         /// 简单获取IP地址
  14.         /// </summary>
  15.         /// <returns></returns>
  16.         public string getIp()
  17.         {
  18.             string guestIp = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
  19.             if (string.IsNullOrEmpty(guestIp))
  20.             {
  21.                 //没有代理IP则直接读取连接客户端IP
  22.                 guestIp = Request.ServerVariables["REMOTE_ADDR"];
  23.             }
  24.             if (string.IsNullOrEmpty(guestIp))
  25.             {
  26.                 guestIp = Request.UserHostAddress;
  27.             }
  28.             return guestIp;
  29.         }

  30.         有看到一种比较全面的写法

  31.         /// <summary>
  32.         /// 获取IP地址
  33.         /// </summary>
  34.         /// <returns></returns>
  35.         public static string getIpAddr()
  36.         {
  37.             string result = String.Empty;
  38.             result = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
  39.             // 如果使用代理,获取真实IP 
  40.             if (result != null && result.IndexOf(".") == -1)    //没有“.”肯定是非IPv4格式 
  41.                 result = null;
  42.             else if (result != null)
  43.             {
  44.                 if (result.IndexOf(",") != -1)
  45.                 {
  46.                     //有“,”,估计多个代理,则取第一个不是内网的IP
  47.                     result = result.Replace(" ", "").Replace("'", "");
  48.                     string[] tmpIp = result.Split(",;".ToCharArray());
  49.                     for (int i = 0; i < tmpIp.Length; i++)
  50.                     {
  51.                         if (IsIpAddress(tmpIp[i]) && tmpIp[i].Substring(0, 3) != "10." && tmpIp[i].Substring(0, 8) != "192.168." && tmpIp[i].Substring(0, 7) != "172.31.")
  52.                         {
  53.                             return tmpIp[i];    //找到不是内网的地址 
  54.                         }
  55.                     }
  56.                 }
  57.                 else if (IsIpAddress(result)) //代理即是IP格式 
  58.                     return result;
  59.                 else
  60.                     result = null;    //代理中的内容 非IP,取IP 
  61.             }
  62.             if (string.IsNullOrEmpty(result))
  63.                 result = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
  64.             if (string.IsNullOrEmpty(result))
  65.                 result = System.Web.HttpContext.Current.Request.UserHostAddress;
  66.             return result;
  67.         }
  68.         /// <summary>
  69.         /// 正则判断是否是IP地址格式 0.0.0.0
  70.         /// </summary>
  71.         /// <param name="strIp">待判断的IP地址</param>
  72.         /// <returns>true or false</returns>
  73.         private static bool IsIpAddress(string strIp)
  74.         {
  75.             if (strIp == null || strIp == string.Empty || strIp.Length < 7 || strIp.Length > 15) return false;
  76.             string regformat = @"^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$";
  77.             Regex regex = new Regex(regformat, RegexOptions.IgnoreCase);
  78.             return regex.IsMatch(strIp);
  79.         }

  80.         第三方获取客户端公网IP

  81.         /// <summary>
  82.         /// 获取客户端公网IP
  83.         /// </summary>
  84.         /// <returns></returns>
  85.         public string getPubIp()
  86.         {
  87.             string strUrl = "http://iframe.ip138.com/ic.asp";
  88.             Uri uri = new Uri(strUrl);
  89.             WebRequest wr = WebRequest.Create(uri);
  90.             Stream s = wr.GetResponse().GetResponseStream();
  91.             StreamReader sr = new StreamReader(s, Encoding.Default);
  92.             string all = sr.ReadToEnd();
  93.             int i = all.IndexOf("[") + 1;
  94.             string tempip = all.Substring(i, 15);
  95.             string ip = tempip.Replace("]", "").Replace(" ", "");
  96.             return ip;
  97.         }



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP 第1章 ASP入门要点 7.如何创建一个ASP文件并浏览其执行结果 第2章 ASP.NET运行模型 12.如何定义变量和判定变量类型 13.什么是变量的作用域 14.如何强制要求显式声明变量 15.如何保留或消除过程调用对变量的影响 16.如何创建和调整动态数组 18.如何计算中英文混合字符串的长度 19.如何判断字符串是否以指定字符串开头或结尾 20.如何判断字符是否是英文字符 21.如何检测字符串出现的次数 22.如何过滤字符串中的HTML代码 23.如何截取字符串 24.如何实现字符串和数组的转换 25.如何实现字符大小写的转换 26.如何将每个单词的首个字母改成大写 27.如何将汉字转换为拼音 28.如何分位显示位数较长的数字 29.如何将数字转换为大写的中文字符 30.如何判断奇数和偶数 32.如何生成一个随机数 33.如何实现VBScript和JavaScript的数据共享(JavaScript to VBScript) 33.如何实现VBScript和JavaScript的数据共享(VBScript to JavaScript) 33.如何实现VBScript和JavaScript的数据共享(Server to Client) 34.如何创建VBScript编码模板 第3章 ASP对象 35.如何创建和获取Application级的对象及变量 36.如何创建和获取Session级的对象及变量 38.如何利用Session防止用户重复投票 40.如何在Session对象失效后重新设置Session对象 41.如何创建、读写和删除Cookie 43.如何遍历Cookies集合 44.如何判断客户端的Cookie是否处于开启状态 45.如何使用Cookie记录用户访问信息 46.如何用Cookie实现仅弹出一次同样的窗口 48.如何清除页面缓存 49.如何获取用户浏览器信息 50.如何获取用户真实的IP地址 52.如何判断网站的虚拟物理路径 53.如何解决URL含有特殊字符引发的错误 第4章 ASP组件 55.如何使用Browser Capabilities组件获取浏览器信息 56.如何使用Ad Rotator组件实现页面导航 57.如何使用Content Linking组件 58.如何使用File Access组件 59.如何使用Counters组件实现网站访问人数统计 60.如何使用ASPPing组件 61.如何使用ASPHttp组件 62.如何用Visual Basic编写ActiveX DLL及其使用 63.如何远程注册DLL文件 64.如何把ASP代码编写成DLL文件 65.如何在ASP中引用类 第5章 ADO数据库 67.如何创建一个断开连接的数据库访问页 68.如何获取数据库表名、字段名以及执行相应操作(获取数据库名) 68.如何获取数据库表名、字段名以及执行相应操作(获取数据库表名) 68.如何获取数据库表名、字段名以及执行相应操作(执行操作) 69.如何在客户端向服务器端数据库批量添加数据 73.如何对欲删除的记录确认后再删除 74.如何用in关键字实现数据的批量删除 75.如何只读取数据库的前几条记录且如何实现排行榜 76.如何实现在多个表中查询数据 77.如何用ASP实现通用条件查询模块 78.如何在ASP整合SQL语句 79.如何实现不刷新页面筛选数据库中的数据 80.如何实现公共的数据分页模块 82.如何在ADO中调用SQL函数 83.如何调用SQL Server存储过程 86.如何用ASP备份和恢复SQL Server数据库 88.如何将图像存入到数据库中 89.如何从数据库中调用显示图像 90.如何用ASP读取Excel文件 91.怎样将数据从Excel导入到SQL Server中 92.怎样将数据从Access导入到SQL Server中 94.如何对Access数据库进行压缩 96.如何使用ASP实现Web数据统计和报表 97.如何在查询结果中搜索 第6章 数据验证 101.如何在ASP中使用正则表达式 102.如何验证字符串为空(示例一) 102.如何验证字符串为空(示例二) 102.如何验证字符串为空(示例三) 102.如何验证字符串为空 (示例四) 103.如何验证字符串包含有效字符 106.如何验证整数或长整数 108.如何验证电子邮件地址 第7章 文件处理 113.读取驱动器信息 113.浏览文件夹下所有文件信息 113.文件夹的复制 113.文件夹的获取 113.文件夹的移动 114.遍历指定目录下的文件 114.遍历目录及目录下的文件 115.使用起泡法按照时间排列文件 117.读取INI文件 118.读取注册表的信息 119.获知文件被改动的情况 120.用ASP实现远程批量文件改名 121.实现无组件文件上传 122.利用组件实现复杂上传功能 123.利用Stream读取显示文件 123.利用Stream上传文件 124.计算下载一个文件需要多长时间 第8章 表单与页面显示 127.如何处理单个网页中多个表单的提交 128.如何防止表单被多次提交 129.如何防止表单在网站外被提交 130.如何解决表单发送数据小于100KB的问题 131.如何在表单中动态添加文本框 132.如何解决下拉列表出现选项重复的问题 133.如何实现在下拉列表中输入文字 134.如何实现级联下拉列表 135.如何根据用户的分辨率调整窗口 136.如何弹出自定义窗口(示例一) 136.如何弹出自定义窗口(示例二) 136.如何弹出自定义窗口(示例三) 137.如何定时自动关闭弹出的窗口 138.如何解决用showModelessDialog弹出新窗口的问题 140.如何强制刷新网页 141.如何吸取网页上的颜色 142.如何将RGB值转换成十六进制值 第9章 使用XML 143.如何创建和显示一个XML文档(示例一) 143.如何创建和显示一个XML文档(示例二) 143.如何创建和显示一个XML文档(示例三) 144.如何在ASP环境下应用XML 145.如何通过XMLDom在服务器端操作XML文件(示例一) 145.如何通过XMLDom在服务器端操作XML文件(示例二) 146.如何使用XML实现不刷新页面查询数据库 147.如何把HTML表单提交的数据转化成XML文件(第一步) 147.如何把HTML表单提交的数据转化成XML文件(第二步) 148.如何在ASP中使用XML实现网页"本地化" 149.如何用XML制作留言本 第10章 专题应用 150.如何统计在线人数 152.如何统计用户在站点停留的时间 153.如何从服务器获得客户端时间 154.如何测试网站速度 156.如何制作防刷新计数器 157.如何实现ASP缓存技术 158.如何在ASP中实现Ping 159.如何打印Iframe中的内容 160.如何用ASP实现网络打印 161.如何用组件实现本地特定打印 162.如何在ASP程序中打印Excel报表 163.如何在ASP中调用Java类 164.如何在线压缩和解压缩WinRAR文件 第11章 综合开发 166.如何实现聊天室功能 167.如何实现网上投票调查 168.如何实现购物车功能 169.如何实现在线影音播放 170.如如何实现论坛功能 171.如何实现智能搜索 172.如何利用索引服务创建站内搜索引擎 173.如何实现电子邮件的自动发送 174.如何使用ASP和Jmail进行邮件群发 第12章 错误与调试 177.如何个性化显示错误信息 178.如何同时显示数据库连接错误和页面错误 第13章 性能优化 第14章 安全加密

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值