10.會(huì)話技術(shù)(session和cookie)

思考:HTTP協(xié)議的特點(diǎn)是無(wú)狀態(tài)/無(wú)連接,這就意味著即使一個(gè)用戶打開(kāi)瀏覽器后,即使以飛快的速度訪問(wèn)一個(gè)網(wǎng)站兩次,那么這個(gè)網(wǎng)站也無(wú)法識(shí)別其為同一個(gè)用戶,那么用戶登錄后,訪問(wèn)不同的頁(yè)面時(shí),服務(wù)器怎么確定用戶在訪問(wèn)其他頁(yè)面時(shí)登錄了呢?

引入:HTTP協(xié)議的無(wú)狀態(tài)/無(wú)連接,在提高通信效率的同時(shí),的確讓服務(wù)器與瀏覽器之間的“關(guān)系”變得冰冷,這個(gè)使用需要通過(guò)其他渠道來(lái)實(shí)現(xiàn)服務(wù)器與瀏覽器的“相識(shí)”,這就是會(huì)話技術(shù)。會(huì)話技術(shù)分為兩部分

  • COOKIE技術(shù)
  • SESSION技術(shù)

總結(jié)

  1. HTTP協(xié)議最開(kāi)始是為Web1.0準(zhǔn)備的,在Web2.0來(lái)臨之后,用戶就不再是從服務(wù)器獲取內(nèi)容這么簡(jiǎn)單,而是需要不斷的與服務(wù)器進(jìn)行交互。所以后來(lái)就衍生出了會(huì)話技術(shù)來(lái)實(shí)現(xiàn)服務(wù)器與瀏覽器互相識(shí)別。
  2. 會(huì)話技術(shù)是解決一次會(huì)話過(guò)程中瀏覽器與服務(wù)器識(shí)別的技術(shù)(默認(rèn)瀏覽器打開(kāi)到關(guān)閉)
  3. 會(huì)話技術(shù)主要是幫助瀏覽器請(qǐng)求服務(wù)器時(shí),服務(wù)器不同的腳本能夠共享數(shù)據(jù)

一、cookie技術(shù)【掌握】

思考:如果瀏覽器與服務(wù)器之間的訪問(wèn)是無(wú)狀態(tài)/無(wú)連接的,那么服務(wù)器怎么能夠做到瀏覽器第二次訪問(wèn)的時(shí)候識(shí)別對(duì)方已經(jīng)來(lái)過(guò)呢?

引入:如果瀏覽器與服務(wù)器之間通信什么都不留下的話,自然是不可能識(shí)別的。但是如果瀏覽器能夠帶點(diǎn)什么服務(wù)器認(rèn)識(shí)的東西過(guò)去的話,這個(gè)問(wèn)題就解決了。這就是COOKIE技術(shù)。

1. cookie技術(shù)認(rèn)識(shí)【掌握】

定義:COOKIE是會(huì)話技術(shù)中的一種,是利用HTTP協(xié)議中增加一組協(xié)議:請(qǐng)求協(xié)議和響應(yīng)協(xié)議,來(lái)實(shí)現(xiàn)互相傳遞數(shù)據(jù),從而讓服務(wù)器能夠識(shí)別瀏覽器。

  1. 瀏覽器第一次訪問(wèn)服務(wù)器的時(shí)候,是什么都沒(méi)有的。因此cookie是由服務(wù)器發(fā)起的。即服務(wù)器在瀏覽器訪問(wèn)后響應(yīng)的時(shí)候,在響應(yīng)頭總增加一個(gè)協(xié)議:set-cookie讓服務(wù)器把數(shù)據(jù)傳遞給瀏覽器
  2. 瀏覽器在第一次拿到服務(wù)器響應(yīng)的時(shí)候,會(huì)解析到set-cookie協(xié)議:然后將數(shù)據(jù)保存到瀏覽器中
  3. 瀏覽器在以后訪問(wèn)的時(shí)候,會(huì)先尋找瀏覽器緩存里是不是有對(duì)應(yīng)網(wǎng)站的cookie數(shù)據(jù),如果有就使用請(qǐng)求頭中的cookie選項(xiàng)把數(shù)據(jù)攜帶過(guò)去
  4. 服務(wù)器在接收瀏覽器請(qǐng)求的時(shí)候,可以通過(guò)請(qǐng)求頭中的cookie獲取數(shù)據(jù),從而判定瀏覽器有沒(méi)有訪問(wèn)過(guò),進(jìn)而達(dá)到識(shí)別瀏覽器的特點(diǎn)
QQ截圖20190528145821.png

總結(jié):cookie技術(shù)就是利用HTTP協(xié)議中請(qǐng)求協(xié)議cookie和響應(yīng)協(xié)議set-cookie來(lái)實(shí)現(xiàn)互相的數(shù)據(jù)傳遞,從而最終實(shí)現(xiàn)瀏覽器與服務(wù)器的“有連接”的


思考:cookie技術(shù)原理清楚了,服務(wù)器與瀏覽器之間是如何實(shí)現(xiàn)的呢?

引入:瀏覽器的實(shí)現(xiàn)很簡(jiǎn)單,就是內(nèi)置了一套規(guī)則,瀏覽器會(huì)這么做(沒(méi)有禁用COOKIE)。而服務(wù)器的話Apache做不了這件事,只能由PHP來(lái)實(shí)現(xiàn)

2. cookie技術(shù)實(shí)現(xiàn)【掌握】

定義:cookie技術(shù)實(shí)現(xiàn)是PHP利用了HTTP協(xié)議規(guī)范,在PHP輸出數(shù)據(jù)之前設(shè)定設(shè)定相關(guān)協(xié)議實(shí)現(xiàn)的。

  1. PHP設(shè)定cookie:PHP提供了一個(gè)函數(shù)setcookie('名字','值')專(zhuān)門(mén)設(shè)置cookie
<?php

# 設(shè)置cookie
setcookie('first','hello');
  1. 瀏覽器保存cookie

瀏覽器請(qǐng)求該P(yáng)HP文件時(shí)HTTP相應(yīng)

HTTP響應(yīng)(cookie).png

瀏覽器中查看cookie:Chrome(F12開(kāi)發(fā)折者工具->application->Cookies->具體網(wǎng)站)

Chrome瀏覽器存儲(chǔ)cookie.png

=

  1. PHP讀取cookie:PHP已經(jīng)設(shè)定了系統(tǒng)變量$_COOKIE,直接在里面即可
<?php

# 讀取cookie
var_dump($_COOKIE);
  1. cookie復(fù)雜數(shù)據(jù)存儲(chǔ):cookie只能(建議)存儲(chǔ)簡(jiǎn)單數(shù)據(jù),但是如果想要存儲(chǔ)多一些或者數(shù)組的數(shù)據(jù)的話,可以使用[]
<?php

# 設(shè)置cookie
setcookie('user[name]','Jim');
setcookie('user[age]','30');

總結(jié)

  1. cookie的使用非常簡(jiǎn)單,只需要在服務(wù)器設(shè)置cookie和訪問(wèn)cookie即可
  2. cookie數(shù)據(jù)的值只能是簡(jiǎn)單數(shù)據(jù),如果非要存儲(chǔ)數(shù)組數(shù)據(jù),可以使用[]和下標(biāo)形式

思考:cookie數(shù)據(jù)保留在瀏覽器上就會(huì)一直存在嗎?

引入:任何數(shù)據(jù)的存儲(chǔ)都是有周期性的,默認(rèn)的cookie周期是瀏覽器關(guān)閉,即會(huì)話結(jié)束

3. cookie高級(jí)應(yīng)用【掌握】

定義:cookie高級(jí)應(yīng)用,即控制cookie的生命周期和訪問(wèn)有效性

  1. 設(shè)定cookie生命周期:cookie的生命周期默認(rèn)是會(huì)話結(jié)束,但是可以通過(guò)setcookie第三個(gè)參數(shù)設(shè)定時(shí)間
<?php

# 設(shè)置cookie生命周期
setcookie('second','world');
setcookie('name','Tom',0);          #0表示會(huì)話周期(瀏覽器關(guān)閉)
setcookie('age',30,time());         #表示設(shè)定time()對(duì)應(yīng)的時(shí)間戳秒數(shù)

# cookie的生命周期設(shè)定是從格林威治時(shí)間到現(xiàn)在的描述限定的,如果要設(shè)定長(zhǎng)周期就需要大過(guò)當(dāng)前時(shí)間戳算
setcookie('long','long',time() + 7 * 24 * 3600); #7天后過(guò)期

有了生命周期之后我們就可以刪除cookie了:就是讓cookie的生命周期提前到期(會(huì)話結(jié)束前)

<?php

# 設(shè)置cookie生命周期
setcookie('die','die',1);
setcookie('heaven','heaven',time() - 1);
  1. cookie有路徑訪問(wèn)問(wèn)題:cookie特性是指定目錄下的同級(jí)目錄或者子目錄可以訪問(wèn),而上級(jí)目錄則不能訪問(wèn)。通常一個(gè)網(wǎng)站的cookie是整個(gè)網(wǎng)站都可以訪問(wèn),所以要設(shè)定cookie的訪問(wèn)路徑為網(wǎng)站根目錄“/”
<?php

# 設(shè)置cookie訪問(wèn)路徑
setcookie('anywhere','anywhere',0,'/');         //當(dāng)前網(wǎng)站整站可訪問(wèn)
  1. cookie跨域問(wèn)題:cookie默認(rèn)只能當(dāng)前網(wǎng)站訪問(wèn)(主機(jī)名限定),如果想不限定cookie的訪問(wèn)網(wǎng)站的話,可以通過(guò)setcookie的第五個(gè)參數(shù)限定
<?php

# 設(shè)置cookie訪問(wèn)限定
setcookie('hole','hole',0,'/','.com');          //所有.com都可以訪問(wèn)
setcookie('home','home',0,'/','taobao.com');    //淘寶下所有網(wǎng)站都可以訪問(wèn):www.taobao.com/e.taobao.com

總結(jié)

  1. cookie可以通過(guò)setcookie的第三個(gè)參數(shù)設(shè)定生命周期,默認(rèn)是會(huì)話結(jié)束
  2. cookie可以通過(guò)setcookie的第四個(gè)參數(shù)來(lái)設(shè)定訪問(wèn)路徑,默認(rèn)是同級(jí)目錄及其子目錄可訪問(wèn)
  3. cookie可以通過(guò)setcookie的第五個(gè)參數(shù)來(lái)設(shè)定訪問(wèn)網(wǎng)站,默認(rèn)是當(dāng)前網(wǎng)站

二、session技術(shù)【掌握】

思考:有了cookie技術(shù)之后,服務(wù)器可以實(shí)現(xiàn)多個(gè)不同的腳本文件共享該數(shù)據(jù)了。但是數(shù)據(jù)是通過(guò)瀏覽器來(lái)存儲(chǔ)的,安全嗎?

引入:瀏覽器上存儲(chǔ)的cookie數(shù)據(jù)是用戶可見(jiàn)的,而且js文件可以從瀏覽器讀取所有cookie,所以顯然是不安全的。而且如果數(shù)據(jù)量大的話,瀏覽器在每次請(qǐng)求服務(wù)器時(shí)都會(huì)帶著cookie,這樣也是浪費(fèi)資源的。所以,如果有一些核心數(shù)據(jù)想要跨腳本共享的話,就要用到session技術(shù)。

1. session技術(shù)認(rèn)識(shí)【掌握】

定義:session技術(shù)是一種存儲(chǔ)在服務(wù)器端,實(shí)現(xiàn)數(shù)據(jù)跨腳本共享的會(huì)話技術(shù),session技術(shù)的實(shí)現(xiàn)是依賴(lài)cookie技術(shù)的。

  1. 瀏覽器第一次訪問(wèn)服務(wù)器時(shí),服務(wù)器會(huì)設(shè)定一個(gè)cookie給瀏覽器,同時(shí)服務(wù)器會(huì)自己創(chuàng)建一個(gè)文件把核心數(shù)據(jù)保存在文件中
  2. 瀏覽器依然還是保存cookie數(shù)據(jù),但是以后傳遞給服務(wù)器時(shí),服務(wù)器會(huì)根據(jù)cookie數(shù)據(jù)來(lái)打開(kāi)對(duì)應(yīng)的服務(wù)器核心文件,從而取出重要內(nèi)容
QQ截圖20190528145841.png

總結(jié)

  1. session是一種保存在服務(wù)器端,能夠跨腳本共享數(shù)據(jù)的技術(shù)
  2. session技術(shù)的實(shí)現(xiàn)依賴(lài)cookie技術(shù)

思考:session技術(shù)的本質(zhì)是識(shí)別操作文件,問(wèn)題是服務(wù)器那么多文件,系統(tǒng)是如何保證文件名字不沖突的呢?

引入:此問(wèn)題還比較簡(jiǎn)單,session文件的名字對(duì)應(yīng)的cookie是有一套內(nèi)部機(jī)制生成32位隨機(jī)字符串,沖突的可能性幾乎不可能。

2. session技術(shù)實(shí)現(xiàn)【掌握】

定義:session技術(shù)不是什么時(shí)候都需要用到的,一般是重要數(shù)據(jù)才用。session會(huì)利用到HTTP協(xié)議以及文件操作來(lái)實(shí)現(xiàn)。

  1. session的使用必須開(kāi)啟session:利用PHP函數(shù)session_start(),session_start完成了幾件事情
  • sessionID獲取,sessionid就是session文件名字的核心部分
    • 讀取cookie:固定cookie名字,PHPSESSID,讀取到了就直接使用
    • 自動(dòng)生成:沒(méi)有讀到cookie,就自動(dòng)生成一個(gè)sessionID,同時(shí)設(shè)置cookie,把該id拼湊到響應(yīng)頭中
  • 尋找sessionid對(duì)應(yīng)的session文件
    • 沒(méi)有:創(chuàng)建對(duì)應(yīng)文件
    • 有:打開(kāi)文件,讀取里面的內(nèi)容
  • 初始化$_SESSION系統(tǒng)變量
    • 沒(méi)有數(shù)據(jù):數(shù)組為空
    • 有數(shù)據(jù):存放到$_SESSION中
<?php
    
# 啟用session
session_start();

瀏覽器訪問(wèn)保存的cookie數(shù)據(jù)


session請(qǐng)求.png
  1. session操作繼續(xù),不管\_SESSION中是否已經(jīng)有數(shù)據(jù)了,我們都可以往_SESSION中讀寫(xiě)數(shù)據(jù)
<?php
    
# 啟用session
session_start();

# 訪問(wèn)session數(shù)據(jù)
var_dump($_SESSION);

# 寫(xiě)入session數(shù)據(jù)
$_SESSION['userinfo'] = array(
    'username' => 'Tom',
    'password' => '123456',
    'age'      => 18
);
  1. session_start開(kāi)啟后,一直在等待:等待腳本執(zhí)行結(jié)束,session系統(tǒng)自動(dòng)將$_SESSION中的數(shù)據(jù)取出來(lái),然后寫(xiě)入到session文件
session文件效果.png
  1. 銷(xiāo)毀session:即刪除當(dāng)前session文件,同時(shí)關(guān)閉session系統(tǒng)。session文件默認(rèn)的是不會(huì)自動(dòng)刪除的,除非程序主動(dòng)刪除:可以使用session_desroy()函數(shù)來(lái)刪除session文件
<?php
    
# 啟用session
session_start();

# 刪除session
session_destroy(); 
#session_destroy()使用后session系統(tǒng)就不再檢測(cè)腳本執(zhí)行了,不會(huì)再次將$_SESSION寫(xiě)入文件

總結(jié)

  1. session必須使用session_start()函數(shù)開(kāi)啟
  2. 只有開(kāi)啟session_start,$_SESSION才能被訪問(wèn)
  3. session開(kāi)啟的腳本,會(huì)在session開(kāi)啟是去訪問(wèn)一次對(duì)應(yīng)的session文件(讀取數(shù)據(jù)),而又會(huì)在腳本執(zhí)行結(jié)束后再次訪問(wèn)session文件(寫(xiě)入)
  4. session_destroy函數(shù)可以刪除session文件,同時(shí)還關(guān)閉session系統(tǒng)

思考:session的生命周期怎么控制呢?

引入:session是一種系統(tǒng)內(nèi)部運(yùn)行的機(jī)制,需要控制session的話,需要修改session的配置項(xiàng)

3. session配置【了解】

定義:session配置,是指根據(jù)開(kāi)發(fā)項(xiàng)目的實(shí)際需求來(lái)調(diào)整session的一些特性

  1. session在php.ini中有很多配置項(xiàng)來(lái)控制session的效果
  • session.name,session存儲(chǔ)cookie的名字,默認(rèn)是PHPSESSID
  • session.auto_start,session是否自動(dòng)開(kāi)啟,默認(rèn)是關(guān)閉
  • session.cookie_lifetime,session設(shè)置的cookie的生命周期,默認(rèn)是會(huì)話結(jié)束
  • session.cookie_path,sessionid在cookie中訪問(wèn)設(shè)定,默認(rèn)是整站訪問(wèn)“/”
  • session.cookie_domain,session對(duì)應(yīng)的cookie的跨域訪問(wèn),默認(rèn)不允許(本站訪問(wèn))
  • session.gc_maxlifetime = 1440,session文件的生命周期,默認(rèn)是24分鐘
  • session.gc_probability = 1,session垃圾回收機(jī)制的概率分子
  • session.gc_divisor = 1000,session垃圾回收機(jī)制的概率分母

注意:即使要修改session效果,通常不會(huì)修改配置文件,而是在程序中通過(guò)ini_set(配置項(xiàng),值)來(lái)動(dòng)態(tài)實(shí)現(xiàn)

  1. 垃圾回收:指session在開(kāi)啟session后,有一定幾率來(lái)觸發(fā)系統(tǒng)回收機(jī)制,然后會(huì)一次性清理所有過(guò)期的session文件

總結(jié)

  1. session的特性都可以通過(guò)配置文件來(lái)修改,一般都不會(huì)修改配置文件修改
  2. session有自己的回收機(jī)制,會(huì)偶爾觸發(fā),但是一次就會(huì)回收所有過(guò)期session文件

三、session與cookie對(duì)比【掌握】

  1. 相同點(diǎn)
  • 目標(biāo)都是實(shí)現(xiàn)服務(wù)器跨腳本共享數(shù)據(jù)
  • 本質(zhì)都是利用了HTTP協(xié)議中的cookie和set-cookie協(xié)議
  1. 不同點(diǎn)
  • 安全性方面
    • session保存在服務(wù)器端,數(shù)據(jù)安全
    • cookie保存在瀏覽器端,數(shù)據(jù)不安全
  • 數(shù)據(jù)大小方面
    • session以單獨(dú)文件存儲(chǔ),理論不限
    • cookie數(shù)量和大小都有限制:20個(gè)/4K
  • 數(shù)據(jù)類(lèi)型方面
    • session可以是任何數(shù)據(jù)類(lèi)型,系統(tǒng)會(huì)自動(dòng)處理
    • cookie只能是簡(jiǎn)單類(lèi)型:數(shù)值和字符串
  • 保存位置
    • session保存在服務(wù)器端
    • cookie保存在瀏覽器端
  • 使用方面
    • session是按需訪問(wèn):開(kāi)啟session_start才訪問(wèn)數(shù)據(jù)
    • cookie是每次都會(huì)提交數(shù)據(jù)

總結(jié)

  1. session比cookie安全
  2. 重要數(shù)據(jù)存session,不重要數(shù)據(jù)存cookie
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。