65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 floodgate 类阻止多次帖子

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.58/5 (6投票s)

2005年9月27日

CPOL

2分钟阅读

viewsIcon

57207

downloadIcon

231

一个简单的类,用于阻止重复提交评论或登录的尝试。

引言

我想和大家分享一些东西。我正在开发一个网站,想要限制客户端每秒钟允许发布的数量。例如,如果访客在上次发布后 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,从而有效地中止该操作。

为了使其更易于使用,您可以捕获该异常并显示一个消息框。

代码

它的工作原理如下

  1. 该类维护一个客户端 IP 的 Hashtable
  2. 每当调用 Assert() 方法时,会执行检查以查看当前客户端 IP(通过使用 HttpContext.Current.Request.UserHostAddress)是否已在列表中。
  3. 如果是,则 Hashtable 条目包含上次操作的 DateTime。如果该日期相隔不超过 n 秒(由构造函数配置),则会抛出 FloodGateException
  4. 如果不是(或已过了足够的时间),则会更新 Hashtable

如果您有兴趣查看整个代码,可以在页面顶部下载。

这个解决方案的优点在于它在代码后置和业务类中都很容易重用,并且您可以为不同的操作声明多个流量闸门。一个缺点是需要引用 System.Web

改进

首先想到的是:清理日期早于最短等待时间的 IP 地址。这将节省宝贵的内存。

© . All rights reserved.