Session和Cookie的區別及Session的生命週期
阿新 • • 發佈:2019-02-19
區別:
1、cookie資料存放在客戶的瀏覽器上,
session資料放在伺服器上
2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session
3、session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能
考慮到減輕伺服器效能方面,應當使用COOKIE
4、單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能3K。
5、300個的限制我沒聽說
為什麼會有cookie呢,大家都知道,http是無狀態的協議,客戶每次讀取web頁面時,伺服器都開啟新的會話,而且伺服器也不會自動維護客戶的上下文資訊,那麼要怎麼才能實現網上商店中的購物車呢,session就是一種儲存上下文資訊的機制,它是針對每一個使用者的,變數的值儲存在伺服器端,通過 SessionID來區分不同的客戶,session是以cookie或URL重寫為基礎的,預設使用cookie來實現,系統會創造一個名為 JSESSIONID的輸出cookie,我們叫做session cookie,以區別persistent cookies,也就是我們通常所說的cookie,注意session cookie是儲存於瀏覽器記憶體中的,並不是寫到硬碟上的,這也就是我們剛才看到的JSESSIONID,我們通常情是看不到JSESSIONID的,但是當我們把瀏覽器的cookie禁止後,web伺服器會採用URL重寫的方式傳遞Sessionid,我們就可以在位址列看到sessionid= KWJHUG6JJM65HS2K6之類的字串。明白了原理,我們就可以很容易的分辨出persistent cookies和session cookie的區別了,網上那些關於兩者安全性的討論也就一目瞭然了,session cookie針對某一次會話而言,會話結束session cookie也就隨著消失了,而persistent cookie只是存在於客戶端硬碟上的一段文字(通常是加密的),而且可能會遭到cookie欺騙以及針對cookie的跨站指令碼攻擊,自然不如 session cookie安全了。
通常session cookie是不能跨視窗使用的,當你新開了一個瀏覽器視窗進入相同頁面時,系統會賦予你一個新的sessionid,這樣我們資訊共享的目的就達不到了,此時我們可以先把sessionid儲存在persistent cookie中,然後在新視窗中讀出來,就可以得到上一個視窗SessionID了,這樣通過session cookie和persistent cookie的結合我們就實現了跨視窗的session tracking(會話跟蹤)。
在一些web開發的書中,往往只是簡單的把Session和cookie作為兩種並列的http傳送資訊的方式,session cookies位於伺服器端,persistent cookie位於客戶端,可是session又是以cookie為基礎的,明白的兩者之間的聯絡和區別,我們就不難選擇合適的技術來開發web service了。
Session的生命週期:
我們已經知道,Session是在使用者第一次訪問網站的時候建立的,那麼Session是什麼時候銷燬的呢?其實,Session使用一種平滑超時的技術來控制何時銷燬Session。預設情況下,Session的超時時間(Timeout)是20分鐘,即使用者保持連續20分鐘不訪問網站,則Session被收回。如果在這20分鐘內使用者又訪問了一次頁面,那麼20分鐘就重新計時了。也就是說,這個超時是連續不訪問的超時時間,而不是第一次訪問後20分鐘必過時。當然,你可以通過修改Web.config檔案的配置項來調整這個超時時間,如下面的程式碼所示:
<sessionState timeout="30"></sessionState>
除了以上在web.config中設定session的有效時間之外,還可以直接程式中設定,如下面程式碼如所示:
Session.Timeout = "30";
以上設定session的有效時間為30分鐘,一旦時間到期,則程式會自動重新分配一個新的sessionID。 不過,你可別太相信Session的Timeout屬性,如果你把它設定為24小時,則很難相信24小時之後使用者的Session還在。Session是否存在,不僅僅依賴於Timeout屬性,以下的情況都可能引起 Session丟失:1)bin目錄中的檔案被改寫。asp.net有一種機制,為了保證dll重新編譯之後,系統正常執行,它會重新啟動一次網站程序,這時就會導致Session丟失。
2)SessionID丟失或者無效。如果你在URL中儲存SessionID,但是使用了絕對地址重定向網站導致URL中的SessionID丟失,那麼原來的Session將失效。如果你在Cookie中儲存SessionID,那麼客戶端禁用Cookie或者Cookie達到了IE中Cookie數量的限制(每個域20個),那麼Session將無效。
3)如果使用InProc的Session,那麼IIS重啟將會丟失Session。同理,如果使用StateServer的 Session,伺服器重新啟動Session也會丟失。
以上是可能會引起session丟失的幾個原因,有時候,我還需要立刻讓Session失效。比如使用者退出系統後,Session中儲存的所有資料需要全部失效。處理方法如下面的程式碼所示:
Session.Abandon();