Session與Cookie的比較javascript
Cookie與Session均可以進行會話跟蹤,可是實現的原理不太同樣。通常狀況下兩者都可以知足需求,但有時候不可使用Cookie,有時候不可使用Session。下面經過比較說明兩者的特色以及適用的場合。php
從存取方式上比較java
Cookie中只能保存ASCII字符串,若是須要存取Unicode字符或者二進制數據,須要進行UTF-8,GBK或者BASE64等方式的編碼。Cookie中也不能直接存取Java對象。若要存儲稍微複雜的信息,使用Cookie是比較困難的。ajax
而Session中能夠存取任何類型的數據,包括而不限於String、Integer、List、Map等。Session中也能夠直接保存Java Bean乃至任何Java類,對象等,使用起來很是方便。能夠把Session看作是一個Java容器類。跨域
從隱私安全上比較瀏覽器
Cookie存儲在客戶端瀏覽器中,對客戶端是可見的,客戶端的一些程序可能會窺探、複製甚至修改Cookie中的內容。而Session存儲在服務器上,對客戶端是透明的,不存在敏感信息泄露的危險。安全
若是選用Cookie,比較好的辦法是,敏感的信息如帳號密碼等儘可能不要寫到Cookie中。最好是像Google、Baidu那樣將Cookie信息加密,提交到服務器後再進行解密,保證Cookie中的信息只有本身能讀得懂。而若是選擇Session就省事多了,反正是放在服務器上,Session裏任何隱私均可以。
從有效期上比較服務器
使用過Google的人都知道,若是登陸過Google,則Google的登陸消息長期有效。用戶沒必要每次訪問都從新登陸,Google會長久地記錄該用戶的登陸信息。要達到這種效果,使用Cookie會是比較好的選擇。只須要設置Cookie的maxAge屬性爲一個很大很大的數字或者Integer.MAX_VALUE就能夠了。Cookie的maxAge屬性支持這樣的效果。網絡
使用Session理論上也能實現這種效果。只要調用方法setMaxInactiveInterval(Integer. MAX_VALUE)不就能夠了麼。可是因爲Session依賴於名爲JSESSIONID的Cookie,而Cookie JSESSIONID的maxAge默認爲-1,只要關閉了瀏覽器該Session就會失效,所以Session不能實現信息永久有效的效果。使用URL地址重寫也不能實現。session
並且若是設置Session的超時時間過長,服務器累計的Session就會越多,越容易致使內存溢出。
從對服務器的負擔上比較
Session是保存在服務器端的,每一個用戶都會產生一個Session。若是併發訪問的用戶很是多,會產生很是多的Session,消耗大量的內存。所以像Google、Baidu、Sina這樣併發訪問量極高的網站,是不太可能使用Session來追蹤客戶會話的。
而Cookie保存在客戶端,不佔用服務器資源。若是併發瀏覽的用戶很是多,Cookie是很好的選擇。對於Google、Baidu、Sina來講,Cookie也許是惟一的選擇。
從瀏覽器支持上比較
Cookie是須要客戶端瀏覽器支持的。若是客戶端禁用了Cookie,或者不支持Cookie,則會話跟蹤會失效。對於WAP上的應用,常規的Cookie就派不上用場了。
若是客戶端瀏覽器不支持Cookie,須要使用Session以及URL地址重寫。須要注意的是全部的用到Session程序的URL都要使用response.encodeURL(String URL)或者response.encodeRedirectURL(String URL)進行URL地址重寫,不然致使Session會話跟蹤失敗。對於WAP應用來講,Session+URL地址重寫也許是它惟一的選擇。
若是客戶端支持Cookie,則Cookie既能夠設爲本瀏覽器窗口以及子窗口內有效(把maxAge設爲-1),也能夠設爲全部瀏覽器窗口內有效(把maxAge設爲某個大於0的整數)。但Session只能在本瀏覽器窗口以及其子窗口內有效。若是兩個瀏覽器窗口互不相干,它們將使用兩個不一樣的Session。
從跨域名上比較:
Cookie支持跨域名訪問,例如將domain屬性設置爲".helloweenvsfei.com",則以".helloweenvsfei.com"爲後綴的全部域名都可以訪問該Cookie。跨域名Cookie如今被普遍用在網絡中,例如Google、Baidu、Sina等。而Session則不會支持跨域名訪問。Session僅在他所在的域名內有效。
注意:僅使用Cookie或者僅使用Session可能實現不了理想的效果。這時應該嘗試一下同時使用Cookie與Session。Cookie與Session的搭配使用在實際項目中會實現絢爛多姿的效果。
放在每一個頁面<body>頂部
<?php session_start(); if(empty($_SESSION["uid"])) { header("location:login.php"); exit(); } echo $_SESSION["uid"]; ?>
顯示頁面
<?php session_start(); //設置倒計時時間 $attr = array(); if(empty($_SESSION["djs"])) { $attr = array("fen"=>1,"miao"=>00); $_SESSION["djs"]=$attr; } else { $attr = $_SESSION["djs"]; } //開始倒計時 //用JS控制 ?> <div id="djs"> <div id="fen"><?php echo $attr["fen"]; ?></div> <div id="miao"><?php echo $attr["miao"]; ?></div> </div> </body> <script type="text/javascript"> $(document).ready(function(e) { window.setInterval("ShowTime()",1000); }); function ShowTime() { $.ajax({ url:"djschuli.php", dataType:"TEXT", success: function(data){ if(data.trim()=="OVER") { $("#djs").text("結束倒計時"); } else { var lie = data.trim().split("|"); $("#fen").text(lie[0]); $("#miao").text(lie[1]); } } }); } </script>
處理頁面
<?php session_start(); $attr = $_SESSION["djs"]; $fen = $attr["fen"]; $miao = $attr["miao"]; if($fen==0 && $miao == 0) { echo "OVER"; exit(); } if($miao == 0) { $attr["miao"] = 59; $attr["fen"] = $attr["fen"]-1; } else { $attr["miao"] = $attr["miao"]-1; } $_SESSION["djs"] = $attr; echo "{$attr['fen']}|{$attr['miao']}";