概覽:
網站中點擊退出,如果僅僅是重定向到登入/出頁面,此時在瀏覽器網址列中輸入登入後的某個頁面地址如主頁,你會發現不用登入就能存取。這種所謂的退出並不是安全的。
那麼怎麼做到安全退出呢?
那就是點選退出後清空對應的Session或Cookie。
清空Session的代碼:
Session.Clear();
Session.Abandon();
登入後複製
清除Cookie的正確代碼(假設Cookie名稱為UserInfo):
if (Request.Cookies["UserInfo"] != null)
{
Response.Cookies["UserInfo"].Expires = DateTime.Now.AddDays(-1);
}
登入後複製
清除Cookie的錯誤碼(假設Cookie名稱為UserInfo):
for (int i = 0; i <Response.Cookies.Count; i++)
{
Response.Cookies[i].Expires = DateTime.Now.AddDays(-1);
}
登入後複製
你會發現,這樣處理後,Cookie依然存在,為什麼就是刪除?我們去看看.NET的HttpCookieCollection實作原始碼:
if (Request.Cookies["UserInfo"] != null)
{
Response.Cookies.Remove("UserInfo");
}
登入後複製
這個操作在HttpCookieCollection這個集合裡面刪除了cookie,當伺服器將資料傳送到客戶端的時候,就不會包含這個已經在服務端刪除了這個已經在服務端刪除的這個已經在服務端刪除了Cookie的任何訊息,瀏覽器也不會對它做任何改變(remove方法只是不讓伺服器向客戶端發送那個被刪除的cookie,與此cookie留不留在客戶機裡無關)。所以cookie刪除不掉的情況就出現。
既然Response.Cookies.Remove沒有辦法實現我們需要的效果,為什麼微軟還有留著呢,因為CookieCollection實現ICollection接口,romove是必須實現的方法,儘管它沒多大的實際價值。而集合的romove也應該是這樣的實作方式,只不過微軟在寫MSDN的時候,描述得太不清楚了,給我們造成了不小的麻煩。
下面就總結下實現安全退出的幾種方式:
1).用Linkbutton,Button等伺服器控制項實現退出
這種方式最好處理:直接在伺服器控制項對應的事件裡編寫清空Session或Cookie的代碼即可。
2).用
註銷等HTML標記實現退出
對於
這個特殊標記,可以這樣實現:
註銷 a> ,在logout.aspx的Page_Load事件中寫出清空Session或Cookie的程式碼即可。 對於等HTML標記,可以在HTML標記的相應client事件中用Js-Ajax,或者jQuery-Ajax,在一般處理程序(.ashx)中編寫清空Session或Cookie的程式碼即可。
對於
等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事件將失效)。