概覽:
網站中點擊退出,如果僅僅是重新導向到登入/出頁面,此時在瀏覽器地址欄中輸入登入後的某個頁面地址如首頁,你會發現不用登入就能訪問。這種所謂的退出並不是安全的。
那麼怎樣做到安全退出呢?
那就是點擊退出後清空相應的Session或Cookie。
清空Session的代碼:
Session.Clear();Session.Abandon();
清除Cookie的正確代碼(假設Cookie名稱為UserInfo):
if (Request.Cookies["UserInfo"] != null){Response.Cookies["UserInfo"].Expires = DateTime.Now.AddDays(-1);}
如果需要清除所有Cookie,則遍曆:
for (int i = 0; i <Response.Cookies.Count; i++){Response.Cookies[i].Expires = DateTime.Now.AddDays(-1);}
清除Cookie的錯誤碼(假設Cookie名稱為UserInfo):
if (Request.Cookies["UserInfo"] != null){Response.Cookies.Remove("UserInfo");}
你會發現,這樣處理後,Cookie依然存在,為什麼就是刪不掉呢?我們去看看.NET的HttpCookieCollection實現源碼:
public void Remove(string name){if (this._response != null){this._response.BeforeCookieCollectionChange();}this.RemoveCookie(name);if (this._response != null){this._response.OnCookieCollectionChange();}}
這個操作在HttpCookieCollection這個集合裡面刪除了cookie,當伺服器將資料轉送到用戶端的時候,不會包含這個已經在服務端刪除了的Cookie的任何資訊,瀏覽器也就不會對它做任何改變(remove方法只是不讓伺服器向客戶機發送那個被刪除的cookie,與此cookie留不留在客戶機裡無關)。所以cookie刪除不掉的情況就出現。
既然Response.Cookies.Remove沒有辦法實現我們需要的效果,為什麼微軟還有留著呢,因為CookieCollection實現ICollection介面,romove是必須實現的方法,儘管它沒多大的實際價值。而集合的romove也應該是這樣的實現方式,只不過微軟在寫MSDN的時候,描述得太不清楚了,給我們造成了不小的麻煩。
下面就總結下實現安全退出的幾種方式:
1).用Linkbutton,Button等伺服器控制項實現退出
這種方式最好處理:直接在伺服器控制項對應的事件裡編寫清空Session或Cookie的代碼即可。
2).用<a>登出</a>等HTML標記實現退出
對於<a></a>這個特殊標記,可以這樣實現: <a href="logout.aspx">登出</a> ,在logout.aspx的Page_Load事件中編寫清空Session或Cookie的代碼即可。
對於<a></a>等HTML標記,可以在HTML標記的相應client事件中用Js-Ajax,或者jQuery-Ajax,在一般處理常式(.ashx)中編寫清空Session或Cookie的代碼即可。
對於<a></a>等HTML標記,還可以這樣:在當前頁面添加一個伺服器控制項如Button,用div包含,並讓其隱藏(注意:隱藏不可見,不能通過伺服器屬性Visible=False,只能通過設定div的display:none;來實現),在Button的伺服器事件Cilck裡編寫清空Session或Cookie的代碼;然後在HTML標記的相應client事件中用Js或者jQuery調用Button控制項的Click事件即可(通過伺服器屬性Visible=False設定Button隱藏,Js或者jQuery調用Button控制項的Click事件將失效)。