陳莉莉
[摘要]基于ASP.net平臺(tái)介紹session的相關(guān)知識(shí)。首先介紹Session的基本概念、作用及工作過(guò)程,然后總結(jié)幾種常見的造成Session值丟失的原因,并給出相應(yīng)的解決思路。
[關(guān)鍵詞]Session丟失解決方法
中圖分類號(hào):TP3文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1671-7597(2009)1120066-01
Session對(duì)象的主要用途是保存信息。當(dāng)一個(gè)用戶第一次登錄網(wǎng)站時(shí),系統(tǒng)會(huì)為其分配一個(gè)Session,只有當(dāng)該客戶退出時(shí),或者Session生命周期結(jié)束時(shí),信息才會(huì)被清除。利用Session還可以創(chuàng)建虛擬購(gòu)物車,當(dāng)客戶在網(wǎng)絡(luò)商店中選擇一種商品時(shí),該商品就會(huì)進(jìn)入到購(gòu)物車?yán)锩?客戶的購(gòu)物信息就會(huì)保存在Session中。
一、Session是什么
Session是指一個(gè)終端用戶與交互系統(tǒng)進(jìn)行通信的時(shí)間間隔,通常指從注冊(cè)進(jìn)入系統(tǒng)到注銷退出系統(tǒng)之間所經(jīng)過(guò)的時(shí)間。具體到web中的Session指的就是用戶在瀏覽某個(gè)網(wǎng)站時(shí),從進(jìn)入網(wǎng)站到瀏覽器關(guān)閉所經(jīng)過(guò)的這段時(shí)間,也就是用戶瀏覽這個(gè)網(wǎng)站所花費(fèi)的時(shí)間。因此,從上述的定義中我們就可以看到,Session實(shí)際上是一個(gè)特定的時(shí)間概念。一個(gè)Session
的概念需要包括特定的客戶端、特定的服務(wù)器端,以及不中斷的操作時(shí)間。A用戶和C服務(wù)器建立連接時(shí)所處的Session,同B用戶和C服務(wù)器中建立連接時(shí)所處的Session是兩個(gè)不同的Session。
二、Session的作用
Session在WEB技術(shù)中占有非常重要的作用。由于網(wǎng)頁(yè)是一種無(wú)狀態(tài)的連接程序,因此你無(wú)法得知用戶的瀏覽狀態(tài)。因此我們必須通過(guò)Session記錄用戶的有關(guān)信息,以供用戶再次以此身份對(duì)web服務(wù)器提供要求時(shí)作確認(rèn)。Session的典型應(yīng)用是存放用戶的Login信息,如用戶名,密碼,權(quán)限角色等信息,應(yīng)用程序(如Email服務(wù)、網(wǎng)上銀行等系統(tǒng))根據(jù)這些信息進(jìn)行身份驗(yàn)證和權(quán)限驗(yàn)證。
三、Session的工作過(guò)程
當(dāng)用戶第一次訪問(wèn)這個(gè)網(wǎng)站時(shí),服務(wù)器自動(dòng)會(huì)給這個(gè)用戶分配一個(gè)SessionID號(hào),瀏覽器只要支持Session,就會(huì)根據(jù)Session的協(xié)議,每次訪問(wèn)網(wǎng)站時(shí)都發(fā)送這個(gè)SessionID給服務(wù)器,服務(wù)器就知道原來(lái)這次http請(qǐng)求還是上次那個(gè)用戶發(fā)的,因?yàn)閔ttp協(xié)議是沒(méi)有狀態(tài)的協(xié)議,而有了SessionID補(bǔ)充,就識(shí)別了用戶。當(dāng)用戶在WEB應(yīng)用程序中間跳轉(zhuǎn)時(shí),存儲(chǔ)在Session對(duì)象中的變量不會(huì)清除,而會(huì)始終存在。Session變量相當(dāng)于運(yùn)行在客戶端多個(gè)頁(yè)面間的全局變量,當(dāng)用戶請(qǐng)求來(lái)自應(yīng)用程序的WEB頁(yè)時(shí),如果該用戶還沒(méi)有會(huì)話,則WEB服務(wù)器將自動(dòng)創(chuàng)建一個(gè)Session對(duì)象。當(dāng)會(huì)話過(guò)期或被放棄后,服務(wù)器將終止該會(huì)話,如果WEB服務(wù)器停止工作,Session也將被釋放。
四、Session值丟失的可能原因及解決方法
1.有些殺病毒軟件會(huì)去掃描Web.Config文件,那時(shí)Session肯定會(huì)丟失。解決方法是:使殺病毒軟件屏蔽掃描Web.Config文件。
2.程序內(nèi)部里有讓Session丟失的代碼。解決方法是:檢查是否有Session.Abandon()之類的代碼。
3.程序有框架頁(yè)面和跨域情況。解決方法是:在Window服務(wù)中將ASP.
NET State Service 啟動(dòng)。
4.在默認(rèn)情況下,Session是保存在進(jìn)程內(nèi)的,IIS5是aspnet_wp.exe,
而IIS6是W3wp.exe,該進(jìn)程不穩(wěn)定,在某些事件發(fā)生時(shí),進(jìn)程會(huì)重起,所以造成了存儲(chǔ)在該進(jìn)程內(nèi)的Session丟失。引起進(jìn)程重起可能有以下幾種情況:(1)配置文件中processModel標(biāo)簽的memoryLimit屬性。(2)Global.asax或者Web.config文件被更改。(3)Bin文件夾中的Web程序(DLL)被修改。(4)殺毒軟件掃描了一些.config文件。
5.文件夾選項(xiàng)中,如果沒(méi)有打開“在單獨(dú)的進(jìn)程中打開文件夾窗口”,一旦新建一個(gè)窗口,系統(tǒng)可能認(rèn)為是新的Session會(huì)話,而無(wú)法訪問(wèn)原來(lái)的Session,所以需要打開該選項(xiàng),否則會(huì)導(dǎo)致Session丟失。
6.大部分的Session丟失是客戶端引起的,所以要從客戶端入手,看看cookie有沒(méi)有打開,或者IE中的cookie數(shù)量限制也可能導(dǎo)致Session的丟失。
五、解決Session丟失的其他方法
1.做Session讀寫日志,每次讀寫Session都要記錄下來(lái),并且要記錄SessionID、Session值、所在頁(yè)面、當(dāng)前函數(shù)、函數(shù)中的第幾次Session操作,通過(guò)這樣的途徑查找丟失的原因會(huì)方便很多。
2.如果允許的話,建議使用state server或sql server保存Session,
這樣不容易丟失。
3.在global.asax中加入代碼,記錄Session的創(chuàng)建時(shí)間和結(jié)束時(shí)間,超時(shí)造成的Session丟失是可以在SessionEnd中記錄下來(lái)的。
5.在用ASP.net開發(fā)程序的時(shí)候遇到Session丟失時(shí),可以完成以下三步,便可保存狀態(tài)。step1:在WEB.CONFIG文件中修改Session狀態(tài)保存模式,如:
六、結(jié)束語(yǔ)
Session的作用不言而喻,在實(shí)際操作和網(wǎng)站開發(fā)建設(shè)中,造成Session值丟失的原因很多,這就需要我們不斷發(fā)現(xiàn)去總結(jié)錯(cuò)誤產(chǎn)生的原因,找到解決的方法。
參考文獻(xiàn):
[1]邵良杉等,ASP.NET(C#)[M].北京:清華大學(xué)出版社,2007:192-193.