首頁  >  文章  >  後端開發  >  PHP會話控制之cookie詳解

PHP會話控制之cookie詳解

小云云
小云云原創
2018-03-26 14:24:381953瀏覽

1.什麼是cookie:

有時也用其複數形式 Cookies,指某些網站為了辨別使用者身分、進行 session 追蹤而儲存在使用者本地端上的資料(通常經過加密)。 Cookies最典型的應用是判定註冊使用者是否已登入網站,使用者可能會得到提示,是否在下次進入此網站時保留使用者資訊以便簡化登入手續,這些都是Cookies的功用。另一個重要應用場合是「購物車」之類處理。使用者可能會在一段時間內在同一家網站的不同頁面中選擇不同的商品,這些資訊都會寫入Cookies,以便在最後付款時提取資訊。

優點:

相容性好

缺點:

1.增加了網路流量;

2.則是它的數據容量有限,最多只能儲存4KB的數據,瀏覽器之間各有不同;客戶端可以停用或清空Cookie,從而影響程式的功能。

3.是不安全。當多人共用一台電腦時使用Cookie可能會洩露使用者隱私, 帶來安全問題。

2.cookie工作原理:

Cookie是Web伺服器存放在使用者硬碟上的一段文本, 其中儲存著一些「鍵—值」對。每個Web網站都可以在使用者的機器上存放 Cookie, 並且可以在需要時重新取得 Cookie 資料。通常Web網站都有一個Cookie檔。使用者每次造訪網站A之前都會尋找網站A的Cookie文件,如果存在,則從中讀取使用者名稱和密碼「鍵—值」對資料。如果找到使用者名稱和密碼「鍵—值」對數據,則將其與存取請求一起傳送到網站A。網站A在收到存取請求時如果也收到了使用者名稱和密碼「鍵—值」對數據,則使用使用者名稱和密碼資料登錄,這樣使用者就不需要輸入使用者名稱和密碼了。如果沒有收到使用者名稱和密碼「鍵—值」對數據,則表示該使用者之前沒有成功登入過,此時網站A返回登入頁面給使用者。另外,每個Cookie都有一個有效期,過了有效期的Cookie就不能再使用了。 常用的Cookie操作是設定Cookie數據和讀取Cookie數據,刪除指定的Cookie數據。

語法:

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = " " [, bool $secure = false [, bool $httponly = false ]]]]]] )

setcookie() 定義了Cookie,會和剩下的HTTP 頭一起傳送給客戶端。 和其他 HTTP 頭一樣,必須在腳本產生任意輸出之前發送Cookie(由於協定的限制)。 請在產生任何輸出之前(包括 100db36a723c770d327fc0aef2ce13b1和 93f0f5c25f18dab9d176bd4f6de5d30e 或空格)呼叫此函數。一旦設定 cookie後,下次開啟頁面時可以使用$_COOKIE讀取。 Cookie 值同樣也存在於 $_REQUEST

name: Cookie 名稱。

value:Cookie 值。 這個數值儲存在使用者的電腦裡,請勿儲存敏感資訊。 例如 name 是 ‘cookiename’, 可透過 $_COOKIE[‘cookiename’] 取得它的值。

expire:Cookie 的過期時間。 這是個 Unix 時間戳,也就是 Unix 紀元以來(格林威治時間 1970 年 1 月 1 日 00:00:00)的秒數。 也就是說,基本上可以用 time() 函數的結果加上希望過期的秒數。 或者也可以用 mktime()。 time()+60*60*24*30 就是設定 Cookie 30 天後過期。 如果設定成零,或忽略參數, Cookie 會在會話結束時過期(也就是關掉瀏覽器時)。

path:Cookie 有效的伺服器路徑。 設定成 ‘/’ 時,Cookie 對整個網域 domain 有效。 如果設定成 ‘/foo/’, Cookie 僅對 domain 中 /foo/ 目錄及其子目錄有效(例如 /foo/bar/)。 預設值是設定 Cookie 時的目前目錄。

domain:Cookie 的有效網域/子網域。 設定成子網域(例如 ‘www.example.com’),會使 Cookie 對這個子網域和它的三級網域有效(例如 w2.www.example.com)。 要讓 Cookie 對整個網域有效(包括它的全部子網域),只要設定成網域就可以了(這個例子裡是 ‘example.com’)。

secure:設定這個 Cookie 是否只是透過安全的 HTTPS 連線傳給客戶端。 設定成 TRUE 時,只有安全連線存在時才會設定 Cookie。 如果是在伺服器端處理這個需求,程式設計師需要僅在安全連線上傳送此類 Cookie (透過 $_SERVER[「HTTPS」] 判斷)。

httponly:設定成 TRUE,Cookie 僅可透過 HTTP 協定存取。 這意思是 Cookie 無法透過類似 JavaScript 這樣的腳本語言存取。 FALSE,則沒有限制。

傳回值

如果在呼叫本函數以前就產生了輸出,setcookie() 會呼叫失敗並傳回 FALSE。 如果 setcookie() 成功運行,則回傳 TRUE。當然,它的意思並非使用者是否已接受 Cookie。

設定和讀取cookie

<?php
    $value="my cookie value"; //发送一个简单的cookie
    setcookie("testcookie",$value,time()+60);  //set cookie?><!DOCTYPE html><html><head>
    <meta charset="UTF-8">
    <title>Testcookie</title></head><body>
    <?php 
        if(isset($_COOKIE["testcookie"])) //判断是否存在
            echo($_COOKIE["testcookie"]."<br>");
        print_r($_COOKIE);    ?></body></html>

刪除cookie

要刪除一個 Cookie,應該設定過期時間為過去,以觸發瀏覽器的刪除機制。

6cea04fb82bc3707e126c08c4226c5fb

用于记录当前用户访问网站的次数:

<?php

   if(isset($_COOKIE["num"]))        $num=$_COOKIE["num"];    else
       $num=0;                        //首次设置cookie

       $num=$num+1;                 
   setcookie("num",$num,time()+60*60) //发送一个cookie num记录访问次数?><!DOCTYPE html><html><head>
   <meta charset="UTF-8">
   <title>Testcookie</title></head><body>
   <?php 
       if($num>1)            echo("您已经第".$num."次访问本站点了。");        else
           echo("欢迎首次访问本站");        //关闭网页后,变量$num将被释放,但因为它的值已经保存再cookie中,所以下次打开网页会连续计数
   ?></body></html>

用户验证身份是验证cookie:

<?php  //身份验证cookie
   header("content-type:text/html;charset=utf-8");
   error_reporting(0);    //取输入的用户名和密码
       $uid=$_POST[&#39;username&#39;];        $upwd=$_POST[&#39;pwd&#39;];    //验证用户名和密码
   if($uid=="admin" && $upwd=="pass")
   {        echo("您已经登入成功,欢迎光临");        if($_POST[&#39;checkboxCookie&#39;]=="on")
       {
           setcookie("username",$uid,time()+60*60*24);
           setcookie("pwd",$upwd,time()+60*60*24);
       }
   }   
   else
       echo("登入失败,请返回重新登录");?><?php
   error_reporting(0);?><!DOCTYPE html><html><head>
   <meta charset="UTF-8">
   <title>Testcookie</title>
   <style type="text/css">form {    margin-top: 300px;    padding-left: 40%;}input[type="password"]{    margin-left: 16px;}input[type="reset"],input[type="submit"]{    margin-left: 80px;}</style></head><body>

   <form action="1.php" method="POST">

   <label>用户名:        <input type="text" name="uesrname" value=" <?php echo($_COOKIE["username"]);?>">    </label>
   <br><br>
                                                       <!-- 保留上次成功登入的用户名-->
   <lable>密码:    <input type="password" name="pwd" value="<?php echo($_COOKIE["password"]);?>" >    </lable>
                                                       <!-- 保留上次成功登入的用户名 -->
   <input type="checkbox" checked name="checkboxCookie">保留用户信息<br><br> <!-- 复选框 -->
   <input type="submit" name="put_info" value="登录">
   <input type="reset" name="rest_info" value="重置">
   </form></body></html>

相关推荐:

如何理解PHP中的会话控制

php中会话控制的深入理解

详细介绍php会话控制的实例代码

以上是PHP會話控制之cookie詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn