日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

较为周全的Asp.net提交验证方案 (下)

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 较为周全的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提交验证方案 (下)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。