程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> form驗證用戶登錄的Cookie

form驗證用戶登錄的Cookie

編輯:關於.NET

做用戶登錄,我一直用form驗證的方式。有時候,為了節省時間,用戶希望用戶名輸入框能夠記住用戶名,省得下次重新輸入。這個時候光用form驗證是不行的,因為form驗證的話,用戶一退出系統就失效了,所以需要借助於CookIE。

本以為做這個會很輕松,誰知花了不少時間也沒有成功。雖然檢驗用戶名和密碼都是正確的,但系統總是拒絕登錄,然後返回到登錄頁面。登錄頁面的用戶名輸入框記是記住用戶名了,但用戶名是亂碼的。

真是郁悶至極!一度以為系統發生了錯亂,重啟機器也還是無濟於事。經反復檢查和測試發現,如果在form驗證之前寫入cookIEs,就會拒絕登錄。這可能是ASP.Net出於安全考慮,發現了一個與from標識相同的cookIEs值,但是它沒有明確地這樣提示。

解決這個問題的做法是,要先驗證登錄再把用戶名寫入cookIEs,這樣就可以成功。

以下為引用的內容:

System.Web.Security.FormsAuthentication.SetAuthCookIE(UserName.Text,false);//登錄...
//將用戶名寫入cookIEs
Response.CookIEs["RememberMe"].Value = HttpUtility.UrlEncode(UserName.Text, System.Text.Encoding.GetEncoding("gb2312"));
Response.CookIEs["RememberMe"].Expires = DateTime.Now.AddMonths(1);

至於輸入框的用戶名顯示為亂碼是因為存儲的是中文用戶名,把中文字符寫入cookies時,如果不做任何處理是會生產亂碼的。解決方法是如上面紅色代碼所示,在寫入的時候使用url編碼,而且編碼格式需要是中文格式的。在取得cookIEs值的時候做相應的解碼即可:

以下為引用的內容:

UserName.Text = HttpUtility.UrlDecode(Request.CookIEs["RememberMe"].Value, System.Text.Encoding.GetEncoding("gb2312"));

另一個問題是刪除cookies,以前一直以為用Response.Cookies.Remove(“RememberMe”)可以刪除,但就是沒有效果。原來調用CookIEs集合的 Remove 方法可從服務器端的集合中移除 Cookie,使 Cookie 不會被發送至客戶端。但是,如果客戶端已存在 Cookie,則該方法無法從客戶端將其移除。 解決方法是,將 CookIE 的到期日期設置為過去的日期,讓用戶的浏覽器來刪除 CookIE:

以下為引用的內容:

if (Response.CookIEs["RememberMe"] != null) Response.CookIEs["RememberMe"].Expires = DateTime.Now.AddDays(-1);//刪除

最後一個問題是創建浏覽器進程的cookIEs(即關閉浏覽器就會自動清空),創建方法相當簡單,不要設置Expires屬性就是默認的浏覽器進程cookIEs。

結尾附上關鍵部分的代碼:

以下為引用的內容:

        System.Web.Security.FormsAuthentication.SetAuthCookIE(UserName.Text,false);//登錄,一定要先驗證

        if (RememberMe.Checked)//再寫入cookIE
        {
            if (Request.CookIEs["RememberMe"] == null)
            {
                Response.CookIEs["RememberMe"].Value = HttpUtility.UrlEncode(UserName.Text, System.Text.Encoding.GetEncoding("gb2312"));
                Response.CookIEs["RememberMe"].Expires = DateTime.Now.AddMonths(1);
            }
        }
        else
        {
            if (Response.CookIEs["RememberMe"] != null) Response.CookIEs["RememberMe"].Expires = DateTime.Now.AddDays(-1);//刪除
        }

讀取cookIEs值的時候:

以下為引用的內容:

        if (!IsPostBack)
        {
            if (Request.CookIEs["RememberMe"] != null)
            {
                UserName.Text = HttpUtility.UrlDecode(Request.CookIEs["RememberMe"].Value, System.Text.Encoding.GetEncoding("gb2312"));
                RememberMe.Checked = true;
            }
        }

總結一下:

1.寫一個與form驗證相同用戶名的值到cookies中,應該先驗證後寫cookIEs,否則會產生沖突,導致驗證不能通過。

2.刪除cookie的正確方法是設置已有cookies的日期為早於當前時間的日期,使用CookIEs.Remove是沒有效果的。

3.創建浏覽器進程的cookIEs,不要設置Expires屬性就行了,這樣關閉浏覽器就會自動被清空

4.cookIEs值是中文的時候最好用gb2312編碼一下,這樣可以避免產生亂碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved