防止页面重复提交

/* -----------------------------------------
 *开 发 者:  awp
 *创建日期:   2009-6-25 星期4
 *功能描述:   防止页面重复提交
 *
 * 用法服务器控件的
 *  <form id="form1" runat="server">
    <input type="text" id="tbxName" runat="server" />
    <input type="text" id="tbxPass" value="" runat="server" />
    <asp:Button ID="btnSubmit" runat="server" OnClick="Button1_Click" Text="Button" />
    <asp:Label ID="lblMessage" runat="server" Text=""></asp:Label>
    <input id="hiddenTest" type="hidden" value="<%=AvoidRefurbish.GetToken() %>" name="hiddenTestN" />
    </form>
 * 后台代码
 * 
 *  protected void Page_Load(object sender, EventArgs e)
    {
        AvoidRefurbish.FirstRefurbish();
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        if (AvoidRefurbish.IfOnRefurbish())
        {
            Response.Write("true");
        }
        else
        {
            Response.Write("false");
        }
    }
 * 
 * 
 * 
 * html控件
 * 
 *   <form id="form1" action="?cmd=add" method="post">
    <input type="text" id="tbxName" runat="server" />
    <input type="text" id="tbxPass" value="" runat="server" />
    <input id="Submit1" type="submit" value="submit" />
    <input id="hiddenTest" type="hidden" value="<%=AvoidRefurbish.GetToken() %>" name="hiddenTestN" />
    </form>
 * 
 *  protected void Page_Load(object sender, EventArgs e)
    {
     AvoidRefurbish.FirstRefurbish();

        if (Request.QueryString["cmd"] != null)
        {
            if (Request.QueryString["cmd"].ToString() == "add")
            {

                if (AvoidRefurbish.IfOnRefurbish())
                {
                    Response.Write("true");
                }
                else
                {
                    Response.Write("false");
                }
            }
        }
    }
 * 
 * 
 * 
 *-----------------------------------------
*/
using  System;
using  System.Data;
using  System.Configuration;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.HtmlControls;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Security.Cryptography;
using  System.Text;

///   <summary>
/// AvoidRefurbish 的摘要说明
///   </summary>
public   class  AvoidRefurbish
{
    
///   <summary>
    
///  判断是否正常提交
    
///   </summary>
    
///   <returns></returns>
     public   static   bool  IfOnRefurbish()
    {
        
if  (HttpContext.Current.Request.Form.Get( " hiddenTestN " ).Equals(GetToken()))
        {
            SetToken();
            
return   true ;
        }
        
return   false ;
    }

    
///   <summary>
    
///  第一次进入页面
    
///   </summary>
     public   static   void  FirstRefurbish()
    {
        
// 第一次载入的时候,生成一个初始的标志 
         if  ( null   ==  HttpContext.Current.Session[ " Token " ])
        {
            SetToken();
        }
    }

    
///   <summary>
    
///  获得当前Session里保存的标志 
    
///   </summary>
    
///   <returns></returns>
     public   static   string  GetToken()
    {
        
if  ( null   !=  HttpContext.Current.Session[ " Token " ])
        {
            
return  HttpContext.Current.Session[ " Token " ].ToString();
        }
        
else
        {
            
return   string .Empty;
        }
    }


    
// 生成标志,并保存到Session 
     private   static   void  SetToken()
    {
        HttpContext.Current.Session.Add(
" Token " , UserMd5(HttpContext.Current.Session.SessionID  +  DateTime.Now.Ticks.ToString()));
    }


    
// 这个函数纯粹是为了让标志稍微短点儿,一堆乱码还特有神秘感,另外,这个UserMd5函数是网上找来的现成儿的 
     private   static   string  UserMd5( string  str1)
    {
        
string  cl1  =  str1;
        
string  pwd  =   "" ;
        MD5 md5 
=  MD5.Create();
        
//  加密后是一个字节类型的数组 
         byte [] s  =  md5.ComputeHash(Encoding.Unicode.GetBytes(cl1));
        
//  通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 
         for  ( int  i  =   0 ; i  <  s.Length; i ++ )
        {
            
//  将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符 
            pwd  =  pwd  +  s[i].ToString( " X " );
        }
        
return  pwd;
    }
}

你可能感兴趣的:(重复提交)