Session和Cookie的附加說明

    關於Session和Cookie的使用彷彿永遠也剖析不完,這須要咱們在實際項目中靈活運用,以至將其各自的特定發揮到極致!今天再次拜讀《Web開發敏捷之道-應用Rails進行敏捷Web開發-第三版》中對Session和Cookie的講解,感受很贊,下面摘抄內容共同提升! 數據庫

關於Cookie 瀏覽器

    瀏覽器會給每一個cookie加上一些附加信息:有效期、有效路徑,以及適用的域名等。若是你給cookies[name]賦上一個值從而建立一個cookie,就會獲得這些選項的默認值:cookie對整個網站有效、永不過時,而且適用於建立cookie的域名。固然,你也能夠傳入一個hash來覆蓋這些默認值。 安全

    可用的選項包括:domain、:expires、:path、:secure和:value。:domain和:path選項指定了cookie的有效範圍——若是後續請求的地址位於cookie的有效域名中,而且路徑又是位於cookie的有效路徑下,那麼瀏覽器就會把cookie發送給服務器。:expire選項設置了cookie的生命時間限制。:expire 選項的值能夠是一個絕對時間,若是客戶機時間超過該時間,瀏覽器就會將cookie刪除;該選項的值也能夠是一個空字符串,此時瀏覽器就只把cookie保存在內存中,在會話結束以後便將其刪除。若是沒有指定過時時間,cookie就是永久有效的。最後,:secure選項會告訴瀏覽器:只有當使用https://發送請求時,才能夠將cookie發回服務器。 服務器

    cookie很適合用於在瀏覽器上保存一些短小的字符串,但並不適於保存大量結構化的數據——你應該用session來保存這些東西。 cookie

       對Cookie設置有效日期的推薦: expire 選項的值是一個絕對時間,當cookie建立時就會設置進去。若是須要指定cookie在用戶的最後一次請求以後多少分鐘過時,你可以在每次請求以後重設cookie,也能夠——更好的辦法是——把cookie過時時間保存在session數據中,而後在那裏更新。 session

    Cookie檢測 數據結構

    當用戶禁用了Cookie後,咱們須要進行必定的檢測,以便咱們能在不借助Cookie的狀況下應用也一樣可靠(即使不能實現所有功能,咱們也能保證不丟失或破壞數據。)
dom

關於Session 網站

    和Cookie不一樣,Session能夠保存任意對象(只要對象能夠序列化),所以很適宜保存WEB的狀態信息。譬如說咱們能夠把購物車對象保存在Session中(雖然前面咱們已經論證過這種方法有欠缺),這樣就能夠在屢次請求之間共享信息。
spa

    注意事項:

    (1)可以放入Session的對象是有限制的,這取決於你的存儲機制(如:I/O對象就不能夠放進去);

    (2)最好不要在Session中存儲大量數據,能夠把他們放進數據庫,而後在Session中引入這些數據,尤爲是對基於Cookie的Session,由於它最多隻能存儲4KB。

    (3)最好不要把常常變化的數據放入Session中。如統計Blog時想把統計結果放進Session,可是若是此時又有用戶發表了blog,數據就不許確了;把用戶信息放入Session也是個很誘人的解決方案。但若是你想經過後臺能禁用某一用戶,這種作法就不這麼及時了!--即使你已經在數據庫中禁用了這些用戶,但他的Session仍然是「有效」的!

    常常變化的數據應該放進數據庫,而後從Session中引入這些數據。

    (4)最好不要把關鍵信息單獨放進Session。譬如,應用在一個請求中生成了一個訂單肯定號,你想把他存入Session中,待用戶提交後再存入數據庫中。但這樣並不安全,若是用戶刪除了瀏覽器的Cookie中的訂單確如號就丟失了!因此,關鍵信息應該保存在數據庫中,而後從session中引用這些數據。

    還有一個問題是:若是把對象存儲進Session中,只要同一瀏覽器再次訪問,它就會視圖訪問此對象,但若是咱們在這一過程當中更改了這一對象,就會形成讀取失敗!解決這一問題的辦法有三個:1)把對象保存在數據庫中 ,只在Session中保存ID;2)若是改變了數據結構定義,就手工刪除服務器端保存的全部Session數據;3)第三個辦法就稍顯複雜,咱們能夠在Session鍵中加上版本號,若是更新了數據結構,就同時也更新版本號。這樣咱們就能夠只加載與當前版本匹配的數據。咱們還能夠記錄各類版本號,以即可以實現更細粒度的版本控制!

Session過時與清除

    Session數據是保存在服務器上的,每一個新的會話都會向Session存儲空間存儲數據,服務器端的資源十分寶貴,因此咱們必須管理好這些空間,否則服務器空間將會被耗盡!從另外一個角度講,應用並不須要Session永久有效,因此咱們須要經過設置失效時間或主動註銷來銷戶Session!


參考:《Web開發敏捷之道-應用Rails進行敏捷Web開發-第三版》P.353--P.363

相關文章
相關標籤/搜索