国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

較為周全的Asp.net提交驗證方案

2024-07-10 13:12:53
字體:
來源:轉載
供稿:網友
下面要對這個生成的“提交驗證”類進行功能擴展,通過.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,再以此獲取對應的驗證碼即可開始生成工作。
以下是頁面提交的代碼:



應用效果:









數據庫數據:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海伦市| 杭州市| 梁山县| 潢川县| 县级市| 祁连县| 永城市| 黑河市| 孟津县| 营山县| 湘潭市| 阿克| 噶尔县| 夏津县| 滨海县| 舒城县| 汶上县| 彰化县| 郴州市| 磐石市| 阿瓦提县| 民丰县| 朝阳市| 黄龙县| 鹰潭市| 武鸣县| 宝山区| 上栗县| 婺源县| 云霄县| 巴中市| 武宣县| 昌邑市| 容城县| 贵定县| 广西| 定州市| 静海县| 永城市| 西乌珠穆沁旗| 通城县|