较为周全的Asp.net提交验证方案 (下)
接上篇。
下面要對這個生成的“提交驗證”類進行功能擴展,通過.Net的“部分類”或“擴展方法”技術都可以輕松實現,這里采用的是“部分類”技術:
引用生成的ADO.NET Entity Framework數據模型的命名空間,且聲明為部分類。
書寫靜態構造函數及一個靜態屬性:
static 提交驗證()
{
?? 過期時間差值=3;
}
?
/// <summary>
/// 用于計算過期時間,單位為分鐘
/// </summary>
public static double 過期時間差值
{
??? get
??? {
??????? return _過期時間差值;
??? }
??? set
??? {
??????? _過期時間差值=value;
??? }
}
private static double _過期時間差值;
書寫添加驗證信息的方法:
/// <summary>
/// 添加一個新的驗證信息,注意在此前應為Session中的任意變量賦值,否則SessionID將隨機變化,無法通過驗證
/// </summary>
/// <param name="驗證碼">要保存的驗證碼</param>
/// <returns>驗證信息ID</returns>
public static Guid 添加(string 驗證碼)
{
??? var a = new 提交驗證
??? {
??????? ID = Guid.NewGuid(),
??????? 會話ID = HttpContext.Current.Session.SessionID,
??????? 是否已提交 = false,
??????? 驗證碼 = 驗證碼,
??????? 過期時間 = DateTime.Now.AddMinutes(過期時間差值)
??? };
??? using (CommonDBEntities c=new CommonDBEntities())
??? {
??????? c.AddTo提交驗證(a);
??????? c.SaveChanges();
??? }
??? return a.ID;
}
此方法將返回添加的驗證信息的GUID,需注意的是在執行此方法之前,必須曾為Session賦值過,未賦值的話SessionID將是隨機的,這會讓后面的驗證函數認為客戶端被劫持。
獲取驗證信息的方法:
/// <summary>
/// 通過ID獲取驗證信息
/// </summary>
/// <param name="ID">驗證信息ID</param>
/// <returns>驗證信息</returns>
public static 提交驗證 獲取(Guid ID)
{
??? try
??? {
??????? 提交驗證 a;
??????? using (CommonDBEntities c = new CommonDBEntities())
??????? {
??????????? a = c.提交驗證.First(f => f.ID == ID);
??????? }
??????? return a;
??? }
??? catch { return null; }
}
驗證用戶提交信息的方法:
/// <summary>
/// 驗證用戶輸入的驗證碼是否正確
/// </summary>
/// <param name="ID">驗證信息ID</param>
/// <param name="驗證碼">用戶輸入的驗證碼</param>
/// <returns>返回錯誤信息,如驗證成功則返回null</returns>
public static string 驗證(Guid ID, string 驗證碼)
{
??? var 驗證信息 = 提交驗證.獲取(ID);
??? if (驗證信息 == null) return "驗證信息無效或已過期";
??? else if (驗證信息.過期時間 < DateTime.Now) return "驗證信息已過期";
??? else if (驗證信息.是否已提交) return "信息已被提交過";
??? else if (驗證信息.會話ID.Trim() != HttpContext.Current.Session.SessionID) return "驗證信息被非法劫持";
??? else if (驗證信息.驗證碼.Trim().ToLower() != 驗證碼.ToLower()) return "驗證碼錯誤";
??? else return null;
}
標記已提交信息及清理超時信息的方法:
/// <summary>
/// 將指定ID的驗證信息設為已提交
/// </summary>
/// <param name="ID">驗證信息ID</param>
public static void 設為已提交(Guid ID)
{
??? using (CommonDBEntities c = new CommonDBEntities())
??? {
??????? var a = c.提交驗證.First(f => f.ID == ID);
??????? a.是否已提交 = true;
??????? c.SaveChanges();
??? }
??? 清理(false);
}
?
/// <summary>
/// 清理數據庫中已失效的舊數據
/// </summary>
/// <param name="是否清理已提交的數據">是否連帶清理已提交過的數據,否則只清理過期數據</param>
/// <returns>波及的數據總量</returns>
public static int 清理(bool 是否清理已提交的數據)
{
??? int x = 0;
??? using (CommonDBEntities c = new CommonDBEntities())
??? {
??????? var a = c.提交驗證.Where(f => f.過期時間 < DateTime.Now || (是否清理已提交的數據 ? f.是否已提交 : false));
??????? foreach (提交驗證 f in a)
??????? {
??????????? c.DeleteObject(f);
??????? }
??????? x=c.SaveChanges();
??? }
??? return x;
}
在設置已提交的方法中順手清理超時信息。
至此,驗證類就編寫完成了。
接下來看看如何使用,先創建一個這樣的頁面:
如前所述,驗證信息ID會明文發給客戶端,即保存在HiddenField控件中。
CustomValidator用于顯示錯誤提示。
以下為頁面Load事件的代碼:
注意在調用添加驗證信息的函數之前設置過了Session的變量,確保SessionID不會再發生改變。
關于生成驗證圖片的代碼到處都是,這里就不累述了,只要通過Url參數“ID”獲取到GUID,再以此獲取對應的驗證碼即可開始生成工作。
以下是頁面提交的代碼:
應用效果:
數據庫數據:
本文至此結束,希望能給各位以幫助,如有更好的解決方案,歡迎在此探討。
下載本文的PDF版本:http://www.box.net/shared/dtisa6mik8
轉載于:https://www.cnblogs.com/SkyD/archive/2008/10/14/1310473.html
總結
以上是生活随笔為你收集整理的较为周全的Asp.net提交验证方案 (下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: chrome插件-Web开发者助手 Fe
- 下一篇: 【测试】ESP32连接蓝牙耳机音箱测试