防止重新整理頁面造成表單重複提交
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>