熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

使用HttpModule來禁用Web表單重復提交

2013-11-13 10:29:32  來源: .NET編程 

  在網速慢或者網站反應慢的情況下如果提交表單需要超過秒的時間還未提交成功多數人會重新點擊提交這樣不僅造成錯誤的數據還會加劇服務器的壓力

  通過使用HttpModule我們可以在表單處理前檢測一些標志從而防止用戶重復提交數據再通過一些接口讓用戶自己來處理重復提交時應該如何告訴用戶

  通過使用HttpModule我們也可以在客戶端表單提交時使用DIV覆蓋住表單從UI層防止用戶再次單擊提交(用戶直接F管不了)

  這種方法使用簡單直接把腳本和圖片放在指定的目錄中然後在nfig中添加Module

      <httpModules>
   <!防止重復提交 LOG記錄MODULE >
   <add name=NonReduplicatePostModule type=testsNonReduplicatePostModuletest/>
   </httpModules>

  下面是實現代碼

      /// NonReduplicatePostModule 的摘要說明
   /// </summary>
   public class NonReduplicatePostModule : SystemWebIHttpModule
   {
   private static ILog log = LogManagerGetLogger(SystemReflectionMethodBaseGetCurrentMethod()DeclaringType);
   private const string hiddenFileName = __NonReduplicatePostModule__;
   private const string maskdivScriptRelativeUrl = ~/js/maskDivjs;
   private const string onformSubmit = EvlonMaskDivInstanceshow();;
   private HttpApplication context = null;
  
   #region IHttpModule 成員
  
   public void Init(HttpApplication context)
   {
   ntext = context;
   ntextPreRequestHandlerExecute+=new EventHandler(context_PreRequestHandlerExecute);
   }
  
   public void Dispose()
   {
   ntextPreRequestHandlerExecute=new EventHandler(context_PreRequestHandlerExecute);
   }
  
   #endregion
  
   private void context_PreRequestHandlerExecute(object sender EventArgs e)
   {
   HttpApplication webApp = sender as HttpApplication;
   if(webApp != null)
   {
   //已經處理過提示用戶不要重復提交
   Page page = webAppContextHandler as Page;
   if(page != null)
   {
   pagePreRender+=new EventHandler(page_PreRender);
  
   //找到Page添加時間
   if(webAppRequestForm[hiddenFileName] != null)
   {
   string flag = webAppRequestForm[hiddenFileName]ToString();
   if(webAppContextCacheGet(flag) != null)
   {
   logDebug(found reduplicate post);
   if(page is IReduplicatePostHandler)
   {
   webAppContextHandler = new ReduplicatePostHandler((IReduplicatePostHandler)page);
   }
   else
   {
   webAppContextHandler = new ReduplicatePostHandler();
   }
   }
   else
   {
   //放進緩存中表示已經被處理過在一分鐘後自動移聊(可再次提交)
   webAppContextCacheAdd(flagDateTimeNownullSystemWebCachingCacheNoAbsoluteExpirationTimeSpanFromMinutes()SystemWebCachingCacheItemPriorityNormalnull);
   }
   }
   }
   }
  
   }
  
  
  
   private void page_PreRender(object sender EventArgs e)
   {
   Page page = sender as Page;
   if(page != null)
   {
   //找到Page添加時間
   pageRegisterHiddenField(hiddenFileNamestringFormat({}_{}_{}pageSessionSessionIDGetHashCode() pageGetType()GetHashCode() DateTimeNowTicks));
   //表單UI顯示 MASKDIV
   pageRegisterClientScriptBlock(maskdiv_include<script type=text/javascript src= + pageResolveUrl(maskdivScriptRelativeUrl) + ></script>);
   pageRegisterOnSubmitStatement(maskdiv onformSubmit);
   }
  
   }
   }
  
   public interface IReduplicatePostHandler
   {
   void OnReduplicatePost(HttpContext context EventArgs e);
   }
  
   internal class ReduplicatePostHandler : IHttpHandler
   {
   private IReduplicatePostHandler handler = null;
   internal ReduplicatePostHandler(IReduplicatePostHandler handler)
   {
   thishandler = handler;
   }
  
   internal ReduplicatePostHandler()
   {
  
   }
  
   #region IHttpHandler 成員
  
   public void ProcessRequest(HttpContext context)
   {
   if(handler != null)
   {
   handlerOnReduplicatePost(contextnew EventArgs());
   }
   else
   {
   contextResponseWrite(不要重復提交);
   }
   }
  
   public bool IsReusable
   {
   get
   {
   // TODO: 添加 ReduplicatePostHandlerIsReusable getter 實現
   return false;
   }
   }
  
   #endregion
  
   }
  
  
  
   用到的JS文件:/js/MaskDIVjs
  
  
  Evlon = {};
  EvlonMaskDiv = function()
  {
   var div = windowdocumentcreateElement(DIV);
   divstyleposition = absolute;
   divstyletop = px;
   divstyleleft = px;
   divstylewidth = %;//documentbodyscrollWidth + px;
   divstyleheight = %; //documentbodyscrollHeight + px;
   divstylebackgroundColor = white;
   divstylezIndex = ;
   divstylefilter = Alpha(style=opacity=);
   divstyleopacity=;
   thisdivMask = div;
  
   div = windowdocumentcreateElement(DIV);
   divstyleposition = absolute;
   divstyletop = px;
   divstyleleft = px;
   divstylewidth = %;//documentbodyscrollWidth + px;
   divstyleheight = %; //documentbodyscrollHeight + px;
   divstylezIndex = ;
  
   thisdivTooltip = div;
  
   thisshow = function()
   {
   //創建半透明DIV
   window__maskDiv__ = documentbodyinsertAdjacentElement(afterBeginthisdivMask);
  
   //創建提示DIV
   window__maskDivText__ = documentbodyinsertAdjacentElement(afterBeginthisdivTooltip);
   window__maskDivText__innerHTML = <table style=bordercollapse:collapse;borderwidth:px;width:%;height:%;><tr height=%><td></td></tr><tr><td align=center valign=top> +
   <table style=bordercollapse:collapse;border:solid px yellow;><tr><td align=right><img width= height= src=image/loadinggif usesrc=image/loadinggif onerror=thissrc= thisusesrc = \/\ + thisusesrc/></td> +
   <td align=left><span style = filter:alpha(opacity=);backgroundcolor:#ccc;fontsize:px>提交中</span></td></tr></table> +
   </td></tr></table>;
  
   }
  
   thishide = function()
   {
   if(window__maskDiv__ != null)
   {
   documentbodyremoveChild(window__maskDiv__);
   window__maskDiv__ = null;
   }
   if(window__maskDivText__ != null)
   {
   window__maskDivText__innerHTML = ;
   documentbodyremoveChild(window__maskDivText__);
   window__maskDivText__ = null;
   }
   }
  }
  
  EvlonMaskDivInstance = new EvlonMaskDiv();
  
  windowshowModalDialogMask = function(sURL vArguments sFeatures)
  {
   var sign = windowshowModalDialog(sURL vArguments sFeatures);
   if(sign != && sign != null)
   {
   //創建半透明DIV
   EvlonMaskDivInstanceshow();
  
   }
  
   return null;
   //return sign;
  }


From:http://tw.wingwit.com/Article/program/net/201311/13804.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.