此前本想在网上找找实现Asp.Net的IP地址屏蔽功能的文章来参考,但是一搜索“IP 屏蔽 asp.net”,出现的全都是:

这些都是对我此前写的《细说Asp.net的IP地址屏蔽功能设计》一文的无情转载,不仅不保留出处、作者,而且连标题都没一个与我原文相同的~~

这篇文章写的是程序设计部分,并没有编程实现屏蔽功能,搜索引擎上翻了几页也没找到个正经写这方面的文章,无奈只好自己来研究实现,并写下此文的续篇了,倒是没什么难度。

本文将介绍通过实现IHttpModule接口,进行判断和屏蔽IP地址的方法。

(HttoModule的基础知识可以参阅这里:http://www.tracefact.net/Asp-Net/Introduction-to-Http-Module.aspx)

阅读前请先参阅《细说Asp.net的IP地址屏蔽功能设计》一文,本文将使用这篇文章中提出的思路,并将使用文中创建的数据库、实体类。

首先,新建一个类,名为IPFilter,继承自IHttpModule接口:

实现IHttpModule接口,并为context对象的AcquireRequestState事件添加事件处理:

(因为我们要用到Session,而在早于AcquireRequestState的事件中Session还未被初始化。参考于:http://www.cnblogs.com/junqilian/archive/2008/03/07/1095454.html)

事件处理方法:

这里的主要功能是从Session中读取用户IP,再从缓存中读取IP地址屏蔽列表,遍历IP地址屏蔽数据,判断是否应当屏蔽当前IP,如果判断为屏蔽,就关闭输出,让客户端无法访问。

黄色高亮区域:这里是在判断Session是否为空,其原因是不能保证执行到这里时Session总是存在的,我曾在有异步访问的页面中遇到过这里报错的情况,所以这样处理比较稳妥。

绿色高亮区域:这是在《细说Asp.net的IP地址屏蔽功能设计》一文中提供的实体类方法。

蓝色高亮区域:辅助方法,其代码见下文:

此方法用于获取IP地址。

此方法用于从数据库中读取有效的IP地址屏蔽数据,并将其装入缓存。

缓存时间设置为固定3分钟。

至此,过滤类就实现了。

接下来还需要向Web.Config文件中注册此HttpModule处理程序:

这样就全部完成了。

屏蔽测试:

添加IP屏蔽数据后3分钟内(依据缓存时间设置),被屏蔽的访问者继续浏览网站就会出现这样的提示了。

源代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Net;

namespace MySite

{

public class IPFilter : IHttpModule

{

void context_AcquireRequestState(object sender, EventArgs e)

{

var c = (sender as HttpApplication).Context;

if (c.Session == null) return;

IPAddress ip = null;

if (c.Session["IP"] == null)

{

c.Session["IP"] = ip = IPAddress.Parse(获取客户端IP地址(c));

}

else ip = c.Session["IP"] as IPAddress;

if (c.Cache["IPFilter"] == null) 更新IP屏蔽列表缓存();

var l = c.Cache["IPFilter"] as List<IP地址屏蔽>;

foreach (var f in l)

{

if (f.检测是否被屏蔽(ip))

{

c.Response.Close();

break;

}

}

}

void 更新IP屏蔽列表缓存()

{

using (var c = new DatabaseEntities())

{

var iplist = c.IP地址屏蔽.Where(f => f.过期时间 > DateTime.Now).ToList();

HttpContext.Current.Cache.Insert("IPFilter",

iplist,

null,

DateTime.Now.AddMinutes(3),

System.Web.Caching.Cache.NoSlidingExpiration,

System.Web.Caching.CacheItemPriority.AboveNormal,

null);

}

}

/// <summary>

/// 获得当前页面客户端的IP

/// </summary>

public static string 获取客户端IP地址(HttpContext c)

{

string result = String.Empty;

result = c.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

if (string.IsNullOrEmpty(result))

{

result = c.Request.ServerVariables["REMOTE_ADDR"];

}

if (string.IsNullOrEmpty(result))

{

result = c.Request.UserHostAddress;

}

if (string.IsNullOrEmpty(result))

{

return "0.0.0.0";

}

return result;

}

#region IHttpModule 成员

public void Dispose()

{

}

public void Init(HttpApplication context)

{

context.AcquireRequestState += new EventHandler(context_AcquireRequestState);

}

#endregion

}

}

总结来说没什么难度,但是因为这段代码在每次请求中都会执行一次,所以对性能要求很高,如果你有什么优化方面的建议,欢迎提出。

下载本文的XPS版本:

本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2009/07/31/1535569.html,如需转载请自行联系原作者

通过HttpModule实现IP地址屏蔽功能相关推荐

  1. 细说Asp.net的IP地址屏蔽功能设计

    出于安全考虑,几乎每个动态网站都具备IP地址屏蔽功能,而网上流传的很多关于该功能的教程大都采用字符串保存和验证IP地址,我认为这是不太科学的,我试图找到最佳的设计方案. "IP地址的长度为3 ...

  2. java webservice ip_通过Web Service实现IP地址查询功能的示例

    实例01 实现一个简单的Web服务访问 本实例将实现IP地址查询接口服务,根据用户传入的IP地址返回IP所在的省.市.地区,实例中将会用到IP地址库用于查询信息,由于数据较多,所以读者可在光盘资源文件 ...

  3. 通过Web Service实现IP地址查询功能

    实例01  实现一个简单的Web服务访问 本实例将实现IP地址查询接口服务,根据用户传入的IP地址返回IP所在的省.市.地区,实例中将会用到IP地址库用于查询信息,由于数据较多,所以读者可在光盘资源文 ...

  4. IP地址定位功能在网站上的应用

    IP地址定位功能是指通过用户的IP地址,确定其大致地理位置,从而在网站或应用程序上实现多种应用. 其中,服务定位应用可以根据用户的IP地址提供与所在地区相关的服务和信息,例如,当用户访问在线购物网站时 ...

  5. 用java程序编写ip仿真器_用java 编写一个可以实现IP地址查询功能的课程设计

    展开全部 下面是获得本机IP地址的方法,跟你的程序捆绑起来,互相发送消息的时候直接将IP发送过去 private static String[] getAllLocalHostIP(){ 323131 ...

  6. 快速获取本机IP地址AWK功能

    有些时候,我们在应用中可能要用到通过linux命令来获取本机IP地址,方法有很多种,例如最常见的就是ifconfig 如果我想尽尽只获取IP地址,方法也有很多种 例如:获取eth0的IP信息,利用cu ...

  7. Android中如何屏蔽IP地址

    前言 前几篇介绍了iptables | 路由策略 | DNS等相关理论基础知识,现在在这基础上,去学习安卓的网络框架并应用这些知识点.Android的网络框架可以细分很多部分,按功能分的话,可以分网络 ...

  8. 如何在Linux下大量屏蔽恶意IP地址

    很多情况下,你可能需要在Linux下屏蔽IP地址.比如,作为一个终端用户,你可能想要免受间谍软件或者IP追踪的困扰.或者当你在运行P2P软件时.你可能想要过滤反P2P活动的网络链接.如果你是一名系统管 ...

  9. 了解IP地址及如何设置IP地址

    众所周知,在电话通讯中,电话用户是靠电话号码来识别的.同样,在网络中为了区别不同的计算机,也需要给计算机指定一个号码,这个号码就是"IP地址". 什么是IP地址 所谓IP地址就是给 ...

最新文章

  1. 数据揭秘清华研究生日常!47%单身,50.7%从未打过游戏...
  2. 精通python-助你精通python,这些学习资源请收好
  3. ios UIScrollView 中控件自动增加间隔
  4. SAP 电商云 Spartacus UI 和 SmartEdit 本地测试环境
  5. C语言试题二十七之请编写程序,实现矩阵(3行3列)的转置(即行列互换)。
  6. java float转换成long_在Java中如何将float转换为long或int数据类型?
  7. 【Python成长之路】python 基础篇 -- global/nonlocal关键字使用
  8. Axure PR9的安装与激活
  9. 一元函数,多元函数,可微的含义 多元函数微分的几何意义 多元函数偏导 那么为什么有微分和可导 能不能固定两个或者多个条件,多偏微分,哈哈
  10. 渗透之——触发Easy File Sharing Web Server 7.2 HEAD缓冲区溢出的Python脚本
  11. CocosCreator downlevelIteration 允许迭代器进行迭代
  12. java append函数_请详细说一下java中append()的方法.
  13. 微信小程序(safair浏览器)flex布局中的坑
  14. 在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数
  15. Leetcode-LCP 25. 古董键盘
  16. ECharts教程(未完)
  17. CloudCore引领核心网云化转型
  18. Jmeter阶梯式加压的方式
  19. 操作系统第四章——文件管理(下)
  20. java毕业设计开题报告超市积分管理系统

热门文章

  1. html保存按钮代码_如何防止Joomla编辑器删除HTML代码
  2. java 测试磁盘io,详解三种Linux测试磁盘IO性能的方法总结,值得收藏
  3. 深入理解JVM(第二版读书笔记)
  4. Python中可变长度的参数args和**kwargs
  5. 自动化用例设计原则+web自动化框架
  6. mysql 目录位置_更改MySQL数据库目录位置
  7. python是最好的语言_Python转Crystal语言或许是个不错的选择
  8. php设计一个盒子类代码_PHP设计模式之备忘录模式(Memento)代码实例大全(25)...
  9. verilog宏功能中dds信号发生器_什么是相位相干性?了解生成相位相干射频信号的三种配置方法...
  10. Keras及其前端配置