首页 / 网页编程 / ASP.NET / 使用HttpModule来禁用Web表单重复提交
使用HttpModule来禁用Web表单重复提交2011-02-11 博客园 阿牛在网速慢或者网站反应慢的情况下,如果提交表单需要超过5秒的时间还未提交成功,多数人会重新点击提交。这样不仅造成错误的数据,还会加剧服务器的压力。通过使用HttpModule,我们可以在表单处理前,检测一些标志,从而防止用户重复提交数据,再通过一些接口,让用户自己来处理重复提交时,应该如何告诉用户。通过使用HttpModule,我们也可以在客户端表单提交时,使用DIV覆盖住表单,从UI层防止用户再次单击提交(用户直接F5管不了)。这种方法使用简单,直接把脚本和图片放在指定的目录中,然后在Web.config中添加Module<httpModules>
<!--防止重复提交 LOG记录MODULE -->
<add name="NonReduplicatePostModule" type="tests.NonReduplicatePostModule,test"/>
</httpModules>下面是实现代码:/// NonReduplicatePostModule 的摘要说明。
/// </summary>
public class NonReduplicatePostModule : System.Web.IHttpModule
{
private static ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private const string hiddenFileName = "__NonReduplicatePostModule__";
private const string maskdivScriptRelativeUrl = "~/js/maskDiv.js";
private const string onformSubmit = "Evlon.MaskDiv.Instance.show();";
private HttpApplication context = null;
#region IHttpModule 成员
public void Init(HttpApplication context)
{
this.context = context;
this.context.PreRequestHandlerExecute+=new EventHandler(context_PreRequestHandlerExecute);
}
public void Dispose()
{
this.context.PreRequestHandlerExecute-=new EventHandler(context_PreRequestHandlerExecute);
}
#endregion
private void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication webApp = sender as HttpApplication;
if(webApp != null)
{
//已经处理过,提示用户不要重复提交
Page page = webApp.Context.Handler as Page;
if(page != null)
{
page.PreRender+=new EventHandler(page_PreRender);
//找到Page,添加时间
if(webApp.Request.Form[hiddenFileName] != null)
{
string flag = webApp.Request.Form[hiddenFileName].ToString();
if(webApp.Context.Cache.Get(flag) != null)
{
log.Debug("found reduplicate post");
if(page is IReduplicatePostHandler)
{
webApp.Context.Handler = new ReduplicatePostHandler((IReduplicatePostHandler)page);
}
else
{
webApp.Context.Handler = new ReduplicatePostHandler();
}
}
else
{
//放进缓存中,表示已经被处理过,在一分钟后自动移聊(可再次提交)
webApp.Context.Cache.Add(flag,DateTime.Now,null,System.Web.Caching.Cache.NoAbsoluteExpiration,TimeSpan.FromMinutes(1),System.Web.Caching.CacheItemPriority.Normal,null);
}
}
}
}
}