相信做asp.net web開發的碼友們,對ASP.NET_SessionId一定不陌生。ASP.NET_SessionId保存在瀏覽器cookie中。那麼它是來源於哪裡?何時生成?何時失效?有何作用呢? 帶著這些疑問,我們開始探尋它。廢話不多說,實踐才是檢驗真理的最好方法,直接上代碼。 打開VS建 ...
相信做asp.net web開發的碼友們,對ASP.NET_SessionId一定不陌生。ASP.NET_SessionId保存在瀏覽器cookie中。那麼它是來源於哪裡?何時生成?何時失效?有何作用呢?
帶著這些疑問,我們開始探尋它。廢話不多說,實踐才是檢驗真理的最好方法,直接上代碼。
打開VS建立一個APS.NET MVC 程式,在HOME頁面添加如下代碼:
clearSession和clearSessionId這兩個是ajax方式請求過去的,不會刷新頁面,對應的後臺方法如下:
對應的action代碼如下:
當參數user不為空時,我們則創建session保存。
好了,現在我們F5調試運行來看看效果:
繼續F5刷新瀏覽器:
可以看到前面兩次刷新瀏覽器 Session["user"] 為Null ,ASP.NET_SessionId 卻發生了變化。那我們第三次 參數user傳值,後臺將會用session保存。如下圖:
可以看到第三次,我們傳值之後,後臺調用的session進行存儲,然後伺服器給該請求分配了一個不同於前兩次的sessionid。那麼瀏覽器獲得了sessionid,第四次請求會帶著它去請求嗎?伺服器能識別嗎?sessionid還會變嗎?馬上刷新頁面,揭曉答案:
可以清楚的看到,第四次訪問,請求標頭是帶著sessionid的,第四次sessionid和第三次一樣並沒有變化。繼續刷新下去,也不會變的!!
很容易得出,第一二次請求,瀏覽器發起的請求標頭裡是沒有sessionid的。那麼伺服器就會認為,該請求是新的,就會分配新的sessionid給該請求。如果該請求在本次訪問中,未用到session操作,那麼
伺服器則認為該sessionid是無效的,伺服器為節省資源開銷,則不會記錄該sessionid。也不會在Response.Cookies中存入該sessionid。只有在第三次存入session之後,伺服器才認為是有效的,才記錄下了第三次的sessionid,
並返回給了瀏覽器,以cookie的方式存取,以作為下次訪問是否有效訪問的憑據。
第四次,request裡面已經存在sessionid了,帶著sessionid請求到伺服器,伺服器發現sessionid,則到自己的記錄去索引,找到了,認為是有效sessionid,則不再為該請求分配sessionid。所以第三次之後,sessionid一直保持不變。
那麼理解了這些,你會問,sessionid什麼時候過期?在哪種條件下過期?
既然sessionid是由於使用了session才產生的,那麼我們清除掉session,sessionid會失效嗎?
如圖,點擊清除session ,再次刷新:
可以看到,第8次session已經清空,可是sessionid依然存在,而且未改變。可見,sessionid的生命周期並未和session“同生共死”。
session在伺服器的預設有效時間是30分鐘,如果在這30分鐘內有帶著該sessionid的請求訪問,那麼則會順延。如果在這段時間,我們關閉瀏覽器,瀏覽的sessionid則會立即消失,再次訪問,伺服器又會分配新的sessionid。之前的sessionid還在伺服器上存在,
會在因為過有效期被系統銷毀,以清理資源空間。
為了驗證上面的觀點,我們點擊清除sessionid按鈕,手動清除瀏覽器sessionid。
再次刷新
sessionid已重新分配~~~
好了,下班了,就說到這裡吧~~~