Session和Cookie的區別

Session和Cookie的區別

常用的會話跟蹤技術是Cookie和Session。Cookie通過在客戶端記錄信息確定用戶身份,Session通過在服務器端記錄信息確定用戶身份。

Viewstate,Session,Cookie的區別: 
Viewstate  

Viewstate的值保存在瀏覽器的html代碼中 , 當瀏覽器關閉 , 則值消失 , 即Viewstate是在本頁面之內各函數間進行傳值的 , 至於爲什麼要使用這種方法 , 因爲在一個事件發生之後 , 頁面可能會刷新 , 如果定義全局變量會被清零 , 所以要使用 Viewstate。

Session

Session採用鍵值對 , 也就是說ID存放客戶端 , 而值放在服務器端 , 是通過用戶的ID去找服務器上對應的值 , 這種方式值放置在服務器端 ,有個時間限制 ,時間到則服務器自動釋放。

Cookie

Cookie則有兩種方法 , 一種方法是把值保存在瀏覽器的變量中 , 當瀏覽器關閉時結束 , 另一種方法是保存在硬盤中 , 只要時間不過期 , 下次還可使用。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

簡述Session與Cookie區別

Session是由應用服務器維持的一個服務器端的存儲空間,用戶在連接服務器時,會由服務器生成一個唯一的SessionID,用該SessionID 爲標識符來存取服務器端的Session存儲空間。而SessionID這一數據則是保存到客戶端,用Cookie保存的,用戶提交頁面時,會將這一 SessionID提交到服務器端,來存取Session數據。這一過程,是不用開發人員干預的。所以一旦客戶端禁用Cookie,那麼Session也 會失效。

服務器也可以通過URL重寫的方式來傳遞SessionID的值,因此不是完全依賴Cookie。如果客戶端Cookie禁用,則服務器可以自動通過重寫URL的方式來保存Session的值,並且這個過程對程序員透明。

可以試一下,即使不寫Cookie,在使用request.getCookies();取出的Cookie數組的長度也是1,而這個Cookie的名字就是JSESSIONID,還有一個很長的二進制的字符串,是SessionID的值。

Cookie是客戶端的存儲空間,由瀏覽器來維持。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1、Session在何時被創建 
一個常見的誤解是以爲session在有客戶端訪問時就被創建,然而事實是直到某server端程 序調用HttpServletRequest.getSession(true)這樣的語句時才被創建,注意如果JSP沒有顯示的使用 <%@pagesession="false"%> 關閉Session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的session對象的來歷。

由於Session會消耗內存資源,因此,如果不打算使用session,應該在所有的JSP中關閉它。

2、Session何時被刪除 
綜合前面的討論,Session在下列情況下被刪除a.程序調用HttpSession.invalidate();或b.距離上一次收到客戶端發送的Session id時間間隔超過了Session的超時設置;或c.服務器進程被停止(非持久Session)

3、如何做到在瀏覽器關閉時刪除Session 
嚴格的講,做不到這一點。可以做一點努力的辦法是在所有的客戶端頁面裏使用javascript代碼window.oncolose來監視瀏覽器的關閉動 作,然後向服務器發送一個請求來刪除Session。但是對於瀏覽器崩潰或者強行殺死進程這些非常規手段仍然無能爲力。

4、有個HttpSessionListener是怎麼回事 
你可以創建這樣的listener去監控session的創建和銷燬事件,使得 在發生這樣的事件時你可以做一些相應的工作。注意是Session的創建和銷燬動作觸發listener,而不是相反。類似的與HttpSession有 關的listener還有HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。

5、存放在Session中的對象必須是可序列化的嗎 
不是必需的。要求對象可序列化只是爲了Session能夠在集羣中被複制或者能夠持久 保存或者在必要時server能夠暫時把Session交換出內存。在Weblogic Server的session中放置一個不可序列化的對象在控制檯上會收到一個警告。我所用過的某個iPlanet版本如果Session中有不可序列化 的對象,在Session銷燬時會有一個Exception,很奇怪。

6、如何才能正確的應付客戶端禁止cookie的可能性 
對所有的URL使用URL重寫,包括超鏈接,form的action,和重定向的URL,具體做法參見[6] 
http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770

7、開兩個瀏覽器窗口訪問應用程序會使用同一個Session還是不同的Session 
參見第三小節對cookie的討論,對Session來說是隻認id不認人,因此不同的瀏覽器,不同的窗口打開方式以及不同的cookie存儲方式都會對這個問題的答案有影響。

8、如何防止用戶打開兩個瀏覽器窗口操作導致的Session混亂 
這個問題與防止表單多次提交是類似的,可以通過設置客戶端的令牌來解決。 就是在服務器每次生成一個不同的id返回給客戶端,同時保存在session裏,客戶端提交表單時必須把這個id也返回服務器,程序首先比較返回的id與 保存在session裏的值是否一致,如果不一致則說明本次操作已經被提交過了。可以參看《J2EE核心模式》關於表示層模式的部分。需要注意的是對於使 用javascript window.open打開的窗口,一般不設置這個id,或者使用單獨的id,以防主窗口無法操作,建議不要再window.open打開的窗口裏做修改 操作,這樣就可以不用設置。

9、爲什麼在Weblogic Server中改變session的值後要重新調用一次session.setValue 
做這個動作主要是爲了在集羣環境中提示Weblogic Server session中的值發生了改變,需要向其他服務器進程複製新的session值。

10、爲什麼Session不見了 
排除Session正常失效的因素之外,服務器本身的可能性應該是微乎其微的,雖然筆者在 iPlanet6SP1加若干補丁的Solaris版本上倒也遇到過;瀏覽器插件的可能性次之,筆者也遇到過3721插件造成的問題;理論上防火牆或者代 理服務器在cookie處理上也有可能會出現問題。
出現這一問題的大部分原因都是程序的錯誤,最常見的就是在一個應用程序中去訪問另外一個應用程序。我們在下一節討論這個問題。


發佈了16 篇原創文章 · 獲贊 5 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章