搜尋
首頁後端開發php教程PHP會話控制之cookie詳解

PHP會話控制之cookie詳解

Mar 26, 2018 pm 02:24 PM
cookieiephp

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(由於協定的限制)。 請在產生任何輸出之前(包括 和 

 或空格)呼叫此函數。一旦設定 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,應該設定過期時間為過去,以觸發瀏覽器的刪除機制。

?>

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

<?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
哪些常見問題會導致PHP會話失敗?哪些常見問題會導致PHP會話失敗?Apr 25, 2025 am 12:16 AM

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

您如何在PHP中調試與會話相關的問題?您如何在PHP中調試與會話相關的問題?Apr 25, 2025 am 12:12 AM

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

如果session_start()被多次調用會發生什麼?如果session_start()被多次調用會發生什麼?Apr 25, 2025 am 12:06 AM

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

您如何在PHP中配置會話壽命?您如何在PHP中配置會話壽命?Apr 25, 2025 am 12:05 AM

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

使用數據庫存儲會話的優點是什麼?使用數據庫存儲會話的優點是什麼?Apr 24, 2025 am 12:16 AM

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

您如何在PHP中實現自定義會話處理?您如何在PHP中實現自定義會話處理?Apr 24, 2025 am 12:16 AM

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

什麼是會話ID?什麼是會話ID?Apr 24, 2025 am 12:13 AM

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

您如何在無狀態環境(例如API)中處理會議?您如何在無狀態環境(例如API)中處理會議?Apr 24, 2025 am 12:12 AM

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器