天天看點

深入了解cookie & session

問:說說session的原理和你對它的了解?

1.session的運作範圍

session機制是一種伺服器端的機制,伺服器使用一種類似于散清單的結構(也可能就是使用散清單)來儲存資訊。

2.session的建立、關閉、删除

      建立時間:直到某server端程式調用httpservletrequest.getsession(true)  |  request.getsessoin();這樣的語句時session才被建立,注意如果jsp沒有顯示的使用 關閉session,則jsp檔案在編譯成servlet時将會自動加上這樣一條語句httpsession session = httpservletrequest.getsession(true).

由于session會消耗記憶體資源,是以,如果不打算使用session,應該在所有的jsp中關閉它。

      jsp關閉session:(1)<%@ page language="java" import="java.util.*" pageencoding="iso-8859-1"session="false"%>

       删除session/失效session:      

       a.程式調用httpsession.invalidate();       

       b.距離上一次收到用戶端發送的session id時間間隔超過了session的逾時設定;

       c.伺服器程序被停止(非持久session)

3.一般情況下,session都是存儲在記憶體裡,當伺服器程序被停止或者重新開機的時候,記憶體裡的session也會被清空,如果設定了session的持久化特性,伺服器就會把session儲存到硬碟上(這個儲存是把記憶體中的session複制一份到本地),當伺服器程序重新啟動或這些資訊将能夠被再次使用.

4.如何做到在浏覽器關閉時删除session

嚴格的講,做不到這一點。可以做一點努力的辦法是在所有的用戶端頁面裡使用javascript代碼window.oncolose來監視浏覽器的關閉動作,然後向伺服器發送一個請求來删除session。但是對于浏覽器崩潰或者強行殺死程序這些非正常手段仍然無能為力。

5.當程式需要為某個用戶端的請求建立一個session的時候,伺服器首先檢查這個用戶端的請求裡是否已包含了一個session辨別- 稱為session_id,如果已包含一個session_id則說明以前已經為此用戶端建立過session,伺服器就按照session_id把這個session檢索出來使用(如果檢索不到,可能會建立一個),如果用戶端請求不包含session_id,則為此用戶端建立一個session并且生成一個與此session相關聯的session_id,session_id的值應該是一個既不會重複,又不容易被找到規律以仿造的字元串,這個session

id将被在本次響應中傳回給用戶端儲存。 儲存這個session_id的方式可以采用cookie,這樣在互動過程中浏覽器可以自動的按照規則把這個辨別發揮給伺服器。一般這個cookie的名字都是類似于seeesionid.而由于cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞回伺服器。經常被使用的一種技術叫做url重寫,就是把session id直接附加在url路徑的後面,附加方式也有兩種,一種是作為url路徑的附加資訊,另一種是作為查詢字元串附加在url後面(采用第一種方式有利于把session

id的資訊和正常程式參數區分開來)。

問:說說cookie的原理和你對它的了解?

      cookie是基于用戶端的技術,正統的cookie分發是通過擴充http協定來實作的,伺服器通過在http的響應頭中加上一行特殊的訓示以提示浏覽器按照訓示生成相應的cookie。然而純粹的用戶端腳本如javascript或者vbscript也可以生成cookie。

       而cookie的使用是由浏覽器按照一定的原則在背景自動發送給伺服器的。浏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用範圍大于等于将要請求的資源所在的位置,則把該cookie附在請求資源的http請求頭上發送給伺服器。

        cookie分為兩種類型,一種為會話cookie,一種為持久cookie。會話cookie存儲在浏覽器記憶體中,當浏覽器關閉的時候,會話cookie就會消失。持久cookie是儲存在硬碟中。如果不設定cookie的最大存活時間的時候(new cookie().setmaxage()),就為會話cookie,如果設定了最大存活時間,那麼這時cookie将會變成持久cookie。浏覽器就會把cookie儲存到硬碟上,關閉後再次打開浏覽器,這些cookie仍然有效直到超過設定的過期時間。

如果要删除cookie,那麼就隻要将其最大生存時間設定為0即可;但是此時必須注意,cookie的路徑path必須相同,否則不能删除指定的cookie。

問:說說session和cookie的差別?

問:使用者禁用cookie的時候如何使用session?

經常被使用的一種技術叫做url重寫,就是把session id直接附加在url路徑的後面,附加方式也有兩種,一種是作為url路徑的附加資訊,另一種是作為查詢字元串附加在url後面(采用第一種方式有利于把session id的資訊和正常程式參數區分開來)。

問:如何不用session實作使用者登入和購物車?

問:如何實作同一應用程式分布部署的時候session同步?

方案一:

問:如何實作不同應用程式的session共享?

問:開兩個浏覽器視窗通路應用程式會使用同一個session還是不同的session

         對session來說是隻認id,是以不同的浏覽器,不同的視窗打開方式以及不同的cookie存儲方式都會對這個問題的答案有影響。

問:如何防止使用者打開兩個浏覽器視窗操作導緻的session混亂?

       這個問題與防止表單多次送出是類似的,可以通過設定用戶端的令牌來解決。就是在伺服器每次生成一個不同的id傳回給用戶端,同時儲存在session裡,用戶端送出表單時必須把這個id也傳回伺服器,程式首先比較傳回的id與儲存在session裡的值是否一緻,如果不一緻則說明本次操作已經被送出過了。可以參看《j2ee核心模式》關于表示層模式的部分。需要注意的是對于使用javascript window.open打開的視窗,一般不設定這個id,或者使用單獨的id,以防主視窗無法操作,建議不要再window.open打開的視窗裡做修改操作,這樣就可以不用設定。