Session和Cookie的區別
從存儲方式上比較數據庫
- Cookie只能存儲字符串,若是要存儲非ASCII字符串還要對其編碼。
- Session能夠存儲任何類型的數據,能夠把Session當作是一個容器
從隱私安全上比較跨域
- Cookie存儲在瀏覽器中,對客戶端是可見的。信息容易泄露出去。若是使用Cookie,最好將Cookie加密
- Session存儲在服務器上,對客戶端是透明的。不存在敏感信息泄露問題。
從有效期上比較瀏覽器
- Cookie保存在硬盤中,只須要設置maxAge屬性爲比較大的正整數,即便關閉瀏覽器,Cookie仍是存在的
- Session的保存在服務器中,設置maxInactiveInterval屬性值來肯定Session的有效期。而且Session依賴於名爲JSESSIONID的Cookie,該Cookie默認的maxAge屬性爲-1。若是關閉了瀏覽器,該Session雖然沒有從服務器中消亡,但也就失效了。
從對服務器的負擔比較安全
- Session是保存在服務器的,每一個用戶都會產生一個Session,若是是併發訪問的用戶很是多,是不能使用Session的,Session會消耗大量的內存。
- Cookie是保存在客戶端的。不佔用服務器的資源。像baidu、Sina這樣的大型網站,通常都是使用Cookie來進行會話跟蹤。
從瀏覽器的支持上比較服務器
- 若是瀏覽器禁用了Cookie,那麼Cookie是無用的了!
- 若是瀏覽器禁用了Cookie,Session能夠經過URL地址重寫來進行會話跟蹤。
從跨域名上比較markdown
- Cookie能夠設置domain屬性來實現跨域名
- Session只在當前的域名內有效,不可誇域名
Cookie和Session共同使用
若是僅僅使用Cookie或僅僅使用Session可能達不到理想的效果。這時應該嘗試一下同時使用Session和Cookiecookie
那麼,何時才須要同時使用Cookie和Session呢?session
- 在上一篇博客中,咱們使用了Session來進行簡單的購物,功能也的確實現了。如今有一個問題:我在購物的途中,不當心關閉了瀏覽器。當我再返回進去瀏覽器的時候,發現我購買過的商品記錄都沒了!!爲何會沒了呢?緣由也很是簡單:服務器爲Session自動維護的Cookie的maxAge屬性默認是-1的,當瀏覽器關閉掉了,該Cookie就自動消亡了。當用戶再次訪問的時候,已經不是原來的Cookie了。
- 咱們如今想的是:即便我不當心關閉了瀏覽器了,我從新進去網站,我還能找到個人購買記錄。
要實現該功能也十分簡單,問題其實就在:服務器爲Session自動維護的Cookie的maxAge屬性是-1,Cookie沒有保存在硬盤中。我如今要作的就是:把Cookie保存在硬盤中,即便我關閉了瀏覽器,瀏覽器再次訪問頁面的時候,能夠帶上Cookie,從而服務器識別出Session。併發
第一種方式:只須要在處理購買頁面上建立Cookie,Cookie的值是Session的id返回給瀏覽器便可dom
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(30*60);
cookie.setPath("/ouzicheng/");
response.addCookie(cookie);
