1. 程式人生 > >Session和Cookie的區別及Session的生命週期

Session和Cookie的區別及Session的生命週期

區別

1、cookie資料存放在客戶的瀏覽器上,  
        session資料放在伺服器上  
2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙  
        考慮到安全應當使用session  
3、session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能  
        考慮到減輕伺服器效能方面,應當使用COOKIE  
4、單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能3K。  

5300個的限制我沒聽說

             為什麼會有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();