前台: |
<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" runat= "server" type= "hidden" value= "<%= GetToken() %>" name= "hiddenTestN" /> |
</div> |
</form> |
后台: |
using System; |
using System.Collections.Generic; |
using System.Linq; |
using System.Web; |
using System.Web.UI; |
using System.Web.UI.WebControls; |
using System.Security.Cryptography; |
using System.Text; |
protected void Page_Load( object sender, EventArgs e) |
{ |
//第一次载入的时候,生成一个初始的标志 |
if ( null == Session[ "Token" ]) |
{ |
SetToken(); |
} |
} |
protected void Button1_Click( object sender, EventArgs e) |
{ |
//如果是Content而不是From 则Context.Request.Form.Get("hiddenTestN").Equals(GetToken()) |
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; |
} |