標籤:
Cookie和Session的作用:
都是用於儲存一些關鍵資料。
Cookie和Session的儲存位置:
Cookie儲存在用戶端,Session儲存在伺服器
Cookie的產生和銷毀以及原理:
Cookie由伺服器產生,通過HTTP協議發送給用戶端。
在協議的回應標頭中的:Set-Cookie標註了這個cookie的資訊:
下次如果有cookie帶給伺服器時,將會在
在協議的要求標頭中的:Cookie標註了這個cookie的資訊:
/* * 正值表示 cookie 將在經過該值表示的秒數後到期。注意,該值是 cookie 到期的最大 存留時間, 不是 * cookie的當前存留時間。 負值意味著 cookie 不會被持久儲存,將在 Web 瀏覽器退出時刪除。0 值會導致刪除cookie*/cookie.setMaxAge(Integer.MAX_VALUE);
Cookie的屬性和特點:
// 建立cookie的時候,就將一個字串類型的k-v值傳入,一個cookie只能由一個k-vCookie 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);//發送這個cookieresponse.addCookie(cookie);
Session的產生和銷毀以及原理:
首先Session作用與一次會話。什麼是會話?就是從開啟這個網站,進行一些操作直到到關閉這個網站。
Session由伺服器產生,產生後將通過Cookie(沒有的話就建立一個)給用戶端發送一個帶有JSESSIONID參數和值的一個索引值。
JSESSIONID就是當前這個會話代表的Session在伺服器記憶體中的一個地區的標識,在一個會話中每次發出請求時都帶有這個Cookie,通過Cookie中的這個JSESSIONID標識就能定位到伺服器中這個Session。
Session的話關閉關閉即刪除,或者使用session.invalidate();移除這個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);這樣的方式來移除對象的,這樣比較好。
JavaEE細節問題05——Cookie和Session