JavaEE細節問題05——Cookie和Session


Cookie和Session的做用:

都是用於存儲一些關鍵數據。java

Cookie和Session的存儲位置:

Cookie儲存在客戶端,Session儲存在服務器瀏覽器


Cookie的產生和銷燬以及原理:

Cookie由服務器產生,經過HTTP協議發送給客戶端。安全

在協議的響應頭中的:Set-Cookie標註了這個cookie的信息服務器

下次若是有cookie帶給服務器時,將會在cookie

在協議的請求頭中的:Cookie標註了這個cookie的信息:session

/*
 * 正值表示 cookie 將在通過該值表示的秒數後過時。注意,該值是 cookie 過時的最大 生存時間, 不是
 * cookie的當前生存時間。 負值意味着 cookie 不會被持久存儲,將在 Web 瀏覽器退出時刪除。0 值會致使刪除cookie
*/
cookie.setMaxAge(Integer.MAX_VALUE);

        刪除Cookie注意:因爲在Http協議中請求發送Cookie的時候只是帶有Cookie的名稱和值,可是一個Cookie的惟一標識是Cookie的名稱+domain+path。因此咱們在刪除Cookie的時候爲了能真正把原來的Cookie的MaxAge改爲0的話,就必需要設置這個Cookie的domain和path,設置的要與以前發送Cookie時同樣。也就是說,發送時怎麼設置的Cookie的path和domain那麼要刪除這個cookie的時候也要這麼設置!!dom


Cookie的屬性和特色:

// 建立cookie的時候,就將一個字符串類型的k-v值傳入,一個cookie只能由一個k-v
Cookie cookie = new Cookie("keyyy", "valueeee");
/*
 * 指定一個描述 cookie 用途的註釋。若是瀏覽器向用戶顯示 cookie,則註釋頗有用。 Netscape Version 0
 * cookie 不支持註釋。
 */
cookie.setComment("testCook");
/*
 * RFC 2109 指定了域名的形式。域名以點 (.foo.com) 開頭,意味着在指定域名系統(Domain Name
 * System,DNS)區域中(例如,www.foo.com,但不是 a.b.foo.com)cookie
 * 對於服務器是可見的。默認狀況下,cookie 只返回給發送它們的服務器。 
 * pattern 包含域名(在其中此 cookie 可見)的String;域名形式符合 RFC 2109
 */
//cookie.setDomain("");
/*
 * 正值表示 cookie 將在通過該值表示的秒數後過時。注意,該值是 cookie 過時的最大 生存時間, 不是
 * cookie的當前生存時間。 負值意味着 cookie 不會被持久存儲,將在 Web 瀏覽器退出時刪除。0 值會致使刪除 cookie。
 */
cookie.setMaxAge(Integer.MAX_VALUE);
/*
 * 指定客戶端應該返回 cookie 的路徑。 cookie 對於指定目錄中的全部頁面及該目錄子目錄中的全部頁面都是可見的。cookie
 * 的路徑必須包括設置 cookie 的 servlet,例如 /catalog,它使 cookie 對於服務器上 /catalog
 * 下的全部目錄都是可見的。默認狀態是當前發送cookie的這一個servlet的同級目錄
 */
//cookie.setPath("");
/*
 * 指示瀏覽器是否只能使用安全協議(如 HTTPS 或 SSL)發送 cookie。 默認值爲 false。 flag 若是爲
 * true,則僅在使用安全協議時將 cookie 從瀏覽器發送到服務器;若是爲 false,則在使用任何協議時均可以發送
 */
cookie.setSecure(false);
/*
 * 在建立 cookie 以後將新值分配給 cookie。若是使用二進制值,則可能須要使用 BASE64 編碼。 對於 Version 0
 * cookie,值不該包含空格、方括號、圓括號、等號、逗號、雙引號、斜槓、問號、at 符號、冒號和分號。
 * 空值在全部瀏覽器上的行爲不必定相同。
 */
cookie.setValue("vvv");
/*
 * 設置此 cookie 遵照的 cookie 協議版本。版本 0 遵照原始 Netscape cookie 規範。版本 1 遵照 RFC
 * 2109。
 */
cookie.setVersion(1);
//發送這個cookie
response.addCookie(cookie);






Session的產生和銷燬以及原理:

首先Session做用與一次回話。什麼是會話?就是打開瀏覽器到關閉瀏覽器編碼

Session由服務器產生(準確的說是request.getSession()方法產生),產生後將經過Cookie(沒有的話就建立一個)spa

給客戶端發送一個帶有JSESSIONID參數和值的一個鍵值。這個cookie沒有設置銷燬時間,也就是說這個cookie的銷燬時間是默認的(一次會話,也就是直到瀏覽器關閉)code

有一點須要注意,因爲打開多個相同瀏覽器窗口可以共享這個Cookie,因此同種瀏覽器在不所有關閉的前提下打開多個窗口是可以共享到這一個Cooie的!!!!!

JSESSIONID就是當前這個會話表明的Session在服務器內存中的一個區域的標識,在一個會話中每次發出請求時都帶有這個Cookie,經過Cookie中的這個JSESSIONID標識就能定位到服務器中這個Session。

在服務器中有一塊內存區域是存放客戶端的Session域,當瀏覽器關閉,存放JSESSIONID的Cookie丟失,這時候只是瀏覽器找不到了服務器中屬於本身的Session區域,而不是服務器中的Session真正的銷燬!


Session實例:



Session的屬性和特色:

Session的建立:


/*
 * 獲取到當前的session
 * getSession()與getSession(true)用法相同!:    若是當前有session,則返回當前的session,若是沒有,就建立一個
 * getSession(false):    當前沒有session,也不建立新的session
 */
HttpSession session  = req.getSession();


Session是一個域,能夠存放對象,做用範圍是一次會話。


關於對象的存取不說了,這裏說說關於對象的移除。


不少人會用session.invalidate()來刪除session,這樣session域中的對象也就沒了,可是這樣很差。

第一個是會傷及無辜,爲了刪除對象a,結果b,c,d也全都沒了。第二個是會浪費資源,由於每次直接刪除

session,那麼在本次回話的下次請求時又得創建新的session。


也有使用removeAttribute(key);這樣的方式來移除對象的,這樣比較好。

相關文章
相關標籤/搜索