Asp.net中安全退出時(shí)清空Session或Cookie的實(shí)例代碼
概覽:
網(wǎng)站中點(diǎn)擊退出,如果僅僅是重定向到登錄/出頁(yè)面,此時(shí)在瀏覽器地址欄中輸入登錄后的某個(gè)頁(yè)面地址如主頁(yè),你會(huì)發(fā)現(xiàn)不用登錄就能訪問(wèn)。這種所謂的退出并不是安全的。
那么怎樣做到安全退出呢?
那就是點(diǎn)擊退出后清空相應(yīng)的Session或Cookie。
清空Session的代碼:
Session.Clear(); Session.Abandon();
清除Cookie的正確代碼(假設(shè)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的錯(cuò)誤代碼(假設(shè)Cookie名稱為UserInfo):
if (Request.Cookies["UserInfo"] != null) { Response.Cookies.Remove("UserInfo"); }
你會(huì)發(fā)現(xiàn),這樣處理后,Cookie依然存在,為什么就是刪不掉呢?我們?nèi)タ纯?NET的HttpCookieCollection實(shí)現(xiàn)源碼:
public void Remove(string name) { if (this._response != null) { this._response.BeforeCookieCollectionChange(); } this.RemoveCookie(name); if (this._response != null) { this._response.OnCookieCollectionChange(); } }
這個(gè)操作在HttpCookieCollection這個(gè)集合里面刪除了cookie,當(dāng)服務(wù)器將數(shù)據(jù)傳輸?shù)娇蛻舳说臅r(shí)候,不會(huì)包含這個(gè)已經(jīng)在服務(wù)端刪除了的Cookie的任何信息,瀏覽器也就不會(huì)對(duì)它做任何改變(remove方法只是不讓服務(wù)器向客戶機(jī)發(fā)送那個(gè)被刪除的cookie,與此cookie留不留在客戶機(jī)里無(wú)關(guān))。所以cookie刪除不掉的情況就出現(xiàn)。
既然Response.Cookies.Remove沒(méi)有辦法實(shí)現(xiàn)我們需要的效果,為什么微軟還有留著呢,因?yàn)镃ookieCollection實(shí)現(xiàn)ICollection接口,romove是必須實(shí)現(xiàn)的方法,盡管它沒(méi)多大的實(shí)際價(jià)值。而集合的romove也應(yīng)該是這樣的實(shí)現(xiàn)方式,只不過(guò)微軟在寫MSDN的時(shí)候,描述得太不清楚了,給我們?cè)斐闪瞬恍〉穆闊?/p>
下面就總結(jié)下實(shí)現(xiàn)安全退出的幾種方式:
1).用Linkbutton,Button等服務(wù)器控件實(shí)現(xiàn)退出
這種方式最好處理:直接在服務(wù)器控件對(duì)應(yīng)的事件里編寫清空Session或Cookie的代碼即可。
2).用<a>注銷</a>等HTML標(biāo)記實(shí)現(xiàn)退出
對(duì)于<a></a>這個(gè)特殊標(biāo)記,可以這樣實(shí)現(xiàn): <a href="logout.aspx">注銷</a>
,在logout.aspx的Page_Load事件中編寫清空Session或Cookie的代碼即可。
對(duì)于<a></a>等HTML標(biāo)記,可以在HTML標(biāo)記的相應(yīng)client事件中用Js-Ajax,或者jQuery-Ajax,在一般處理程序(.ashx)中編寫清空Session或Cookie的代碼即可。
對(duì)于<a></a>等HTML標(biāo)記,還可以這樣:在當(dāng)前頁(yè)面添加一個(gè)服務(wù)器控件如Button,用div包含,并讓其隱藏(注意:隱藏不可見(jiàn),不能通過(guò)服務(wù)器屬性Visible=False,只能通過(guò)設(shè)置div的display:none;來(lái)實(shí)現(xiàn)),在Button的服務(wù)器事件Cilck里編寫清空Session或Cookie的代碼;然后在HTML標(biāo)記的相應(yīng)client事件中用Js或者jQuery調(diào)用Button控件的Click事件即可(通過(guò)服務(wù)器屬性Visible=False設(shè)置Button隱藏,Js或者jQuery調(diào)用Button控件的Click事件將失效)。
以上所述是小編給大家介紹的Asp.net中安全退出時(shí)清空Session或Cookie的實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
ASP.NET 防止按鈕多次提交核心實(shí)現(xiàn)代碼
防止按鈕多次提交通常都是在注冊(cè)表單中提示時(shí)的一個(gè)小功能,具體實(shí)現(xiàn)如下,由此需求的朋友可以參考下2013-08-08記錄游客頁(yè)面訪問(wèn)IP的簡(jiǎn)易實(shí)現(xiàn)代碼 (asp.net+txt)
記錄游客頁(yè)面訪問(wèn)IP的簡(jiǎn)易實(shí)現(xiàn) (asp.net for notepad)2010-01-01Asp.Net Core中服務(wù)的生命周期選項(xiàng)區(qū)別與用法詳解
這篇文章主要給大家介紹了關(guān)于Asp.Net Core中服務(wù)的生命周期選項(xiàng)區(qū)別與用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11linq to sql中,如何解決多條件查詢問(wèn)題,答案,用表達(dá)式樹(shù)!
有個(gè)小項(xiàng)目中,用到了linq to sql,既然這樣,想必需要做多條件組合查詢了,雖然我對(duì)表達(dá)式樹(shù)的研究也只是寥寥地,但除此方法,似乎別無(wú)他法,只好硬著頭皮研究一下.2011-08-08ASP.NET Core讀取Request.Body的正確方法
相信大家在使用ASP.NET Core進(jìn)行開(kāi)發(fā)的時(shí)候,肯定會(huì)涉及到讀取Request.Body的場(chǎng)景,畢竟我們大部分的POST請(qǐng)求都是將數(shù)據(jù)存放到Http的Body當(dāng)中,本文就介紹一下ASP.NET Core讀取Request.Body,感興趣的可以了解一下2021-05-05.NET 排序 Array.Sort<T> 實(shí)現(xiàn)示例
System.Array.Sort<T> 是.NET內(nèi)置的排序方法, 本文就詳細(xì)的介紹一下具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2021-09-09ASP.net 驗(yàn)證碼實(shí)現(xiàn)代碼(C#)
asp.net 驗(yàn)證碼效果實(shí)現(xiàn)代碼2008-02-02VS2017 Cordova Ionic2 移動(dòng)開(kāi)發(fā)環(huán)境搭建教程
這篇文章主要為大家詳細(xì)介紹了VS2017 Cordova Ionic2 移動(dòng)開(kāi)發(fā)環(huán)境搭建教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04