1. 程式人生 > >防止重新整理頁面造成表單重複提交

防止重新整理頁面造成表單重複提交

 

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //第一次載入的時候,生成一個初始的標誌
        if (null == Session["Token"])
        {
            SetToken();
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        if (Request.Form.Get("hiddenTestN").Equals(GetToken()))
        {
            lblMessage.ForeColor = System.Drawing.Color.Blue;
            lblMessage.Text = "正常提交表單";
            SetToken();//別忘了最後要更新Session中的標誌
        }
        else
        {
            lblMessage.ForeColor = System.Drawing.Color.Red;
            lblMessage.Text = "重新整理提交表單";
        }
    }

    //獲得當前Session裡儲存的標誌
    public string GetToken()
    {
        if (null != Session["Token"])
        {
            return Session["Token"].ToString();
        }
        else
        {
            return string.Empty;
        }
    }

    //生成標誌,並儲存到Session
    private void SetToken()
    {
        Session.Add("Token", UserMd5(Session.SessionID + DateTime.Now.Ticks.ToString()));
    }

    //這個函式純粹是為了讓標誌稍微短點兒,一堆亂碼還特有神祕感,另外,這個UserMd5函式是網上找來的現成兒的
    protected 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;
    }

<body>
    <form id="form1" runat="server">
    <div>
             <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="<%= GetToken() %>" name="hiddenTestN"/>
         </div>

    </form>
</body>