Windows XP 平板电脑版嵌入式Windows MobileWindows VistaWindows 2003Windows 2000Windows XP中级开发Visual StudioWindows.NETASP.NETC#
使用 floodgate 类阻止多次帖子






4.58/5 (6投票s)
一个简单的类,用于阻止重复提交评论或登录的尝试。
引言
我想和大家分享一些东西。我正在开发一个网站,想要限制客户端每秒钟允许发布的数量。例如,如果访客在上次发布后 10 秒内发布评论,则该人贡献的帖子不太可能是很有用的内容。很可能,该帖子以某种方式是自动化的。
解决方案
我编写的这个类实际上非常易于使用。例如,如果您有一个事件处理程序来实现评论的发布,您的代码可能如下所示
private void Submit_click(object sender, EventArgs args)
{
if(Page.IsValid)
{
//Your code to persist the details in the database.
}
}
现在,要添加我们的流量闸门,请更改代码,使其看起来像这样
private static FloodGate _submitFlooding;
private void Submit_click(object sender, EventArgs args)
{
if(Page.IsValid)
{
if(_submitFlooding == null)
{
_submitFlooding = new FloodGate("Post Comment",
TimeSpan.FromSeconds(10))
}
_submitFlooding.Assert();
//Your code to persist the details in the database.
}
}
首先,我声明对 FloodGate
类的静态引用。这确保我的流量闸门保存在内存中,跨越对该应用程序的所有请求。
当有人点击提交按钮时,会分配一个 FloodGate
的实例。它有两个参数:闸门的名称,以及每次操作之间的最小延迟。
每当有人(具有某个客户端 IP 地址)在 10 秒内点击该按钮时,会抛出一个 FloodGateException
,从而有效地中止该操作。
为了使其更易于使用,您可以捕获该异常并显示一个消息框。
代码
它的工作原理如下
- 该类维护一个客户端 IP 的
Hashtable
。 - 每当调用
Assert()
方法时,会执行检查以查看当前客户端 IP(通过使用HttpContext.Current.Request.UserHostAddress
)是否已在列表中。 - 如果是,则
Hashtable
条目包含上次操作的DateTime
。如果该日期相隔不超过 n 秒(由构造函数配置),则会抛出FloodGateException
。 - 如果不是(或已过了足够的时间),则会更新
Hashtable
。
如果您有兴趣查看整个代码,可以在页面顶部下载。
这个解决方案的优点在于它在代码后置和业务类中都很容易重用,并且您可以为不同的操作声明多个流量闸门。一个缺点是需要引用 System.Web
。
改进
首先想到的是:清理日期早于最短等待时间的 IP 地址。这将节省宝贵的内存。