Session與Cookie

SessionCookie的比較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']}";
相關文章
相關標籤/搜索