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是客戶端的儲存空間,由瀏覽器來維持。

在一些投票之類的場合,我們往往因為公平的原則要求每人只能投一票,在一些WEB開發中也有類似的情況,這時候我們通常會使用COOKIE來實現,例如如下的程式碼:

< % cookie[]cookies = request.getCookies();

if (cookies.lenght == 0 || cookies == null)

doStuffForNewbie();

//沒有訪問過

}

else

{

doStuffForReturnVisitor(); //已經訪問過了

}

% >

這是很淺顯易懂的道理,檢測COOKIE的存在,如果存在說明已經執行過寫入COOKIE的程式碼了,然而執行以上的程式碼後,無論何時結果都是執行doStuffForReturnVisitor(),通過控制面板-Internet選項-設定-察看檔案卻始終看不到生成的cookie檔案,奇怪,程式碼明明沒有問題,不過既然有cookie,那就顯示出來看看。

cookie[]cookies = request.getCookies();

if (cookies.lenght == 0 || cookies == null)

out.println(“Has not visited this website”);

}

else

{

for (int i = 0; i < cookie.length; i++)

{

out.println(“cookie name:” + cookies[i].getName() + “cookie value:” +

cookie[i].getValue());

}

}

執行結果:

cookie name:JSESSIONID cookie value:KWJHUG6JJM65HS2K6

為什麼會有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了。

CACHE ,則是伺服器端的快取,是所有使用者都可以訪問和共享的。