服務(wù)熱線
153 8323 9821
在Web.Config文件中加入<sessionState mode="InProc"></sessionState>語句,但 是在關(guān)閉IE頁面時好像并未觸發(fā)Session_End事件。我實驗了一個用于記錄來訪人數(shù) 的小網(wǎng)頁程序,使用了Application["visitor_counter"]變量。首先修改Web.config 文件,將上面的<session...>語句加入其<Configuration><system.web>下。然后在 Session_Start事件中使用如下語句: Application.Lock(); Application["visitor_counter"]=(int)Application["visitor_counter"]+1; Application.UnLock(); 在Session_End事件中使用如下語句: Application.Lock(); Application["visitor_counter"]=(int)Application["visitor_counter"]-1; Application.UnLock(); 最后在default.asp中加入了一個Label元素,將Application["visitor_counter"]信 息以字符串格式輸出。 結(jié)果是每打開一次網(wǎng)頁,Application["visitor_counter"]值就增1,但是關(guān)閉網(wǎng)頁 并未是其減少1。請問這是怎么回事,如何解決。
回答:
除非程序通知服務(wù)器刪除一個session,否則服務(wù)器會一直保留,程序一般都是在用戶做log off的時候發(fā)個指令去刪除session。然而瀏覽器從來不會主動在關(guān)閉之前通知服務(wù)器它將要關(guān)閉,因此服務(wù)器根本不會有機(jī)會知道瀏覽器已經(jīng)關(guān)閉,之所以會有這種錯覺,是大部分session機(jī)制都使用會話cookie來保存session id,而關(guān)閉瀏覽器后這個 session id就消失了,再次連接服務(wù)器時也就無法找到原來的session。如果服務(wù)器設(shè)置的cookie被保存到硬盤上,或者使用某種手段改寫瀏覽器發(fā)出的HTTP請求頭,把原來的session id發(fā)送給服務(wù)器,則再次打開瀏覽器仍然能夠找到原來的session。 怎么解決呢? 由于關(guān)閉瀏覽器不會導(dǎo)致session被刪除,所以服務(wù)器為seesion設(shè)置了一個失效時間,當(dāng)距離客戶端上一次使用session的時間超過這個失效時間時,服務(wù)器就可以認(rèn)為客戶端已經(jīng)停止了活動,才會把session刪除以節(jié)省存儲空間。 大概是你關(guān)閉及統(tǒng)計需要一定的時間反應(yīng),刷新幾下是不是減1了? 要是還沒有,那你通知我,讓我想想是怎么回事