對ASP.NET Cookie的一些新的認識

來源:互聯網
上載者:User
做使用者登入,我一直用form驗證的方式。有時候,為了節省時間,使用者希望使用者名稱輸入框能夠記住使用者名稱,省得下次重新輸入。這個時候光用form驗證是不行的,因為form驗證的話,使用者一退出系統就失效了,所以需要藉助於Cookie。本以為做這個會很輕鬆,誰知花了不少時間也沒有成功。雖然檢驗使用者名稱和密碼都是正確的,但系統總是拒絕登入,然後返回到登入頁面。登入頁面的使用者名稱輸入框記是記住使用者名稱了,但使用者名稱是亂碼的。真是鬱悶至極!一度以為系統發生了錯亂,重啟機器也還是無濟於事。經反覆檢查和測試發現,如果在form驗證之前寫入cookies,就會拒絕登入。這可能是asp.net出於安全考慮,發現了一個與from標識相同的cookies值,但是它沒有明確地這樣提示。解決這個問題的做法是,要先驗證登入再把使用者名稱寫入cookies,這樣就可以成功。System.Web.Security.FormsAuthentication.SetAuthCookie(UserName.Text,false);//登入...//將使用者名稱寫入cookiesResponse.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);//刪除結尾附上關鍵區段的代碼:        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;            }        }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.