溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中session 與 cookie是什么

發(fā)布時(shí)間:2020-10-14 18:10:06 來(lái)源:億速云 閱讀:176 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹PHP中session 與 cookie是什么,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

session 與 cookie 是什么?

session 與 cookie 屬于一種會(huì)話控制技術(shù)。常用在身份識(shí)別,登錄驗(yàn)證,數(shù)據(jù)傳輸?shù)?。舉個(gè)例子,就像我們?nèi)コ匈I東西結(jié)賬的時(shí)候,我們要拿出我們的會(huì)員卡才會(huì)獲取優(yōu)惠。這時(shí)候,我們?cè)趺醋R(shí)別這個(gè)會(huì)員卡真實(shí)有效的呢?當(dāng)我們將會(huì)員號(hào)給到收銀員,收銀員根據(jù)我們提供的會(huì)員號(hào),輸入到系統(tǒng)中,系統(tǒng)根據(jù)這個(gè)會(huì)員號(hào)去查詢,如果查詢到了就證明這個(gè)會(huì)員號(hào)是真實(shí)存在的。這里的會(huì)員號(hào)就好比 cookie 與 session. 會(huì)員系統(tǒng)就好比服務(wù)器端,收銀員就好比客戶端.

為什么會(huì)用到 session 與 cookie 呢?

根據(jù)上述的例子,我們知道 session 與 cookie 是可以干什么的了,那為什么必須用這個(gè)來(lái)實(shí)現(xiàn)呢?這里就有必要了解一下 http 應(yīng)用傳輸協(xié)議的特點(diǎn)了。由于 http 協(xié)議是無(wú)狀態(tài)的,即瀏覽器去請(qǐng)求了一個(gè)網(wǎng)頁(yè),這時(shí)候就是一個(gè) http 請(qǐng)求,當(dāng)服務(wù)端接收到請(qǐng)求之后,返回客戶端需要的數(shù)據(jù),在這過(guò)程中瀏覽器與服務(wù)器是建立了一個(gè)連接的。但是當(dāng)服務(wù)端返回?cái)?shù)據(jù),客戶端收到數(shù)據(jù)之后,他們的這種連接關(guān)系就斷開了。下次瀏覽器再去發(fā)送請(qǐng)求的時(shí)候,又是重新建立一個(gè)連接,這兩個(gè)鏈接沒有任何關(guān)系。試想一下,當(dāng)我們登錄一個(gè)商場(chǎng)系統(tǒng)的時(shí)候,進(jìn)入首頁(yè)做了登錄操作,但是我們下單或者加入購(gòu)物車的時(shí)候,還需要登錄,每訪問(wèn)一個(gè)頁(yè)面就要登錄,是不是很繁瑣同時(shí)也是很不科學(xué)的,萬(wàn)一我們加入購(gòu)物車的商品,我們點(diǎn)擊下單了,下單頁(yè)面要登錄而且還無(wú)法正確的反饋出你下單時(shí)的那些商品.

Http 特點(diǎn)

1.http 協(xié)議支持客戶端 / 服務(wù)端模式,也是一種請(qǐng)求 / 響應(yīng)模式的協(xié)議。

2. 無(wú)連接。所謂的無(wú)連接就是服務(wù)器收到了客戶端的請(qǐng)求之后,響應(yīng)完成并收到客戶端的應(yīng)答之后,即斷開連接。限制每次的連接只處理一次請(qǐng)求。從而節(jié)省傳輸時(shí)間。

3. 無(wú)狀態(tài)。http 協(xié)議對(duì)事務(wù)的處理沒有記憶能力。也就意味著如果需要前面的信息,只能重傳,這無(wú)形之中增加數(shù)據(jù)的傳輸量。這種方式某種方面上講解放了服務(wù)器,但是卻不利于客戶端與服務(wù)器的連接。為了彌補(bǔ)這種不足,產(chǎn)生了兩項(xiàng)記錄 http 狀態(tài)的技術(shù),一個(gè)叫做 Cookie, 一個(gè)叫做 Session,后面我們?cè)偌?xì)講它們。

4. 簡(jiǎn)單快捷:所謂的簡(jiǎn)單快捷是指客戶端向服務(wù)器請(qǐng)求服務(wù)時(shí),一般來(lái)說(shuō)只需要傳輸請(qǐng)求方法和路徑,就能進(jìn)行訪問(wèn)

5. 靈活:這里主要指的是客戶端可以通過(guò) http 協(xié)議傳輸任意類型的數(shù)據(jù)。比如傳輸.jpg 文件、.ppt 文件等等,只需要設(shè)定 content-type 就可以進(jìn)行傳輸。

Cookie

cookie 的基本概念

cookie 是遠(yuǎn)程瀏覽器存儲(chǔ)數(shù)據(jù)以此追蹤用戶和識(shí)別用戶的的機(jī)制,從實(shí)現(xiàn)來(lái)說(shuō),cookie 是存儲(chǔ)在客戶端上的一個(gè)數(shù)據(jù)片段。

cookie 的運(yùn)行原理與存儲(chǔ)機(jī)制

. 運(yùn)行原理

1. 客戶端向服務(wù)端發(fā)起一個(gè) http 請(qǐng)求.

2. 服務(wù)端設(shè)置一個(gè)創(chuàng)建 cookie 的指令,響應(yīng)給客戶端.

3. 客戶端收到服務(wù)端響應(yīng)的指令,根據(jù)指令在客戶端創(chuàng)建一個(gè) cookie.

4. 擋下一次請(qǐng)求時(shí),客戶端攜帶這個(gè) cookie 向服務(wù)端發(fā)送請(qǐng)求.

. 存儲(chǔ)機(jī)制

總的來(lái)說(shuō),cookie 在客戶端存儲(chǔ)的形式有三種,不同的瀏覽器的存儲(chǔ)機(jī)制不同,存的 cookie 也不同.

1. 文件存儲(chǔ)。瀏覽器會(huì)針對(duì)不同的域,在磁盤的對(duì)應(yīng)目錄創(chuàng)建一個(gè)單獨(dú)的文件,來(lái)存儲(chǔ)該域下面的 cookie 值.

2. 內(nèi)存存儲(chǔ)。當(dāng)瀏覽器關(guān)閉時(shí),該 cookie 隨之消失。根據(jù)下面的創(chuàng)建語(yǔ)法,當(dāng)我們未設(shè)置過(guò)期時(shí)間時(shí)則會(huì)出現(xiàn)這種情況.

3.flash 存儲(chǔ)。這種存儲(chǔ)方式是永久存儲(chǔ)在磁盤中,即使通過(guò)瀏覽器刪除一些數(shù)據(jù)都是無(wú)法刪除該方式存儲(chǔ)的 cookie,如果需要?jiǎng)h除,可能通過(guò)磁盤的方式.

cookie 的設(shè)置

Bool setcookie(string $name[, string $values, $expire=0[,string $path[,string $domain[, bool $secure = false[, bool $httpOnly = false]]]]] );

$name:cookie存儲(chǔ)的名稱,必填選項(xiàng).

$values:cookie存儲(chǔ)的值。這里需要注意的是,當(dāng)把該值設(shè)置為false時(shí),客戶端會(huì)嘗試刪除這個(gè)cookie值,因此在要將值這是為true或者false的時(shí)候,我們用另外的值來(lái)代替,例如true用1代替,false用0來(lái)代替.

$expire:cookie的過(guò)期時(shí)間,秒為單位,當(dāng)該值被設(shè)置時(shí),定時(shí)刪除;當(dāng)該值沒有設(shè)置時(shí),該值是永久有效的.該值設(shè)置為小于當(dāng)前時(shí)間時(shí),會(huì)出發(fā)瀏覽器的刪除機(jī)制,會(huì)自動(dòng)刪除cookie.

$path:cookie有效的目錄,默認(rèn)的目錄是"/",即表示當(dāng)前的正個(gè)域名都生效.

$domain:cookie的作用域名,默認(rèn)的是當(dāng)前域名有效,如果需要設(shè)置直接填寫生效的域名即可.需要注意的是IE瀏覽器有長(zhǎng)度限制,當(dāng)只有大于5的時(shí)候才會(huì)生效.

$secure:cookie的加密處理,當(dāng)設(shè)置為true的時(shí)候,需要使用HTTPS協(xié)議,才會(huì)生效.

$httpOnly:決定cookie是否只使用http協(xié)議,當(dāng)設(shè)置為1或者true,其他非http協(xié)議是無(wú)法操作cookie的。例如我們未設(shè)置的時(shí)候,我們JavaScript是可以對(duì)cookie進(jìn)行設(shè)置的.這樣一定程度上保證了安全性.這種情況需考慮瀏覽器是否支持該配置項(xiàng).

. 設(shè)置 cookie 的函數(shù)還有 setrawcookie () 函數(shù),只不過(guò)該函數(shù)不會(huì)對(duì)值 進(jìn)行 urlencode 序列號(hào).

.<font color="red"> 有時(shí)候,我們可能遇到這種情況,我們?cè)谶@個(gè)頁(yè)面設(shè)置了 cookie,但是去刷新頁(yè)面獲取 cookie,按理說(shuō)是會(huì)獲取到 cookie 的,但實(shí)際情況是無(wú)法獲取到,這是由于 cookie 運(yùn)行機(jī)制導(dǎo)致,PHP 創(chuàng)建了 cookie 這個(gè)指令,告訴瀏覽器,你需要執(zhí)行這個(gè)指令了,這時(shí)候?yàn)g覽器才會(huì)去執(zhí)行這個(gè)指令,因此是無(wú)法獲取到 cookie 的.

. 在設(shè)置 cookie 之前,不能有任何輸出.

// 實(shí)現(xiàn)方式一
setcookie($cookie,"hello,world!", 3600);
// 實(shí)現(xiàn)方式二
header("header("Set-Cookie: testcookie=中文; path=/; domain=.sunphp.org; expires=".gmstrftime("%A, %d-%b-%Y %H:%M:%S GMT",time()+9600));");
// 兩則的作用是一樣的,setcookie是PHP內(nèi)置函數(shù),是對(duì)http協(xié)議的操作封裝。

cookie 的獲取

$_COOKIE['$cookeName'];

cookie 的應(yīng)用

. 用戶身份識(shí)別

. 數(shù)據(jù)傳輸

. 登錄控制 (是否登錄、單點(diǎn)登錄)

cookie 跨域設(shè)置

我們都知道,在前端開發(fā)中時(shí)常會(huì)遇到 ajax 跨域問(wèn)題,我們解決的方式有很多種,可以參考這篇文章傳送門 1,傳送門 2,cookie 跨域我們可以參考 p3p 傳輸協(xié)議傳送門

cookie 使用的注意事項(xiàng)

. 數(shù)量限制,客戶端對(duì)每一個(gè) domian 下的 cookie 是有數(shù)量限制的,不是創(chuàng)建任意數(shù)量就行.

. 安全性,根據(jù)上面的創(chuàng)建語(yǔ)法,我們可以得知,當(dāng)我們未設(shè)置 $httpOnly 值得時(shí)候,非 http 協(xié)議是可以操作 cookie 的值的,例如 JavaScript 通過(guò) cookie ($cookieName). 而且一些抓包工具也是可以抓取到 cookie 的,還有就是 cookie 存儲(chǔ)在客戶端的文件中,如果獲取到這個(gè) cookie,也是可以對(duì) cookie 做一些操作的。為了防止別人可以拷貝 cookie 文件,進(jìn)行惡意操作,可以對(duì) cookie 進(jìn)行加密處理.

數(shù)據(jù)傳輸:當(dāng) cookie 數(shù)量很多,數(shù)據(jù)很大的時(shí)候,其實(shí)對(duì)于帶寬是有消耗的。比較 http 傳輸都需要帶寬,當(dāng) http 傳輸?shù)臄?shù)據(jù)量大了,帶了的帶寬消耗就大.

Session

運(yùn)行原理與存儲(chǔ)機(jī)制

. 運(yùn)行原理

1. 客戶端向服務(wù)端發(fā)起請(qǐng)求,建立通信

2. 服務(wù)端根據(jù)設(shè)置的 session 創(chuàng)建指令,在服務(wù)端創(chuàng)建一個(gè)編號(hào)為 sessionid 的文件,里面的值就是 session 具體的值 (組成部分 變量名 | 類型 : 長(zhǎng)度:值).

3. 服務(wù)端將創(chuàng)建好的 sessionid 編號(hào)響應(yīng)給客戶端,客戶則將該編號(hào)存在 cookie 中 (一般我們?cè)跒g覽器存儲(chǔ)的調(diào)試欄中會(huì)發(fā)現(xiàn) cookie 中有一個(gè) PHPSESSID 的鍵,這就是 sessionid,當(dāng)然這個(gè)名稱,我可以通過(guò)設(shè)置服務(wù)端是可以改變的).

. 當(dāng)下一次請(qǐng)求時(shí),客戶端將這個(gè) sessionid 攜帶在請(qǐng)求中,發(fā)送給服務(wù)端,服務(wù)端根據(jù)這個(gè) sessionid 來(lái)做一些業(yè)務(wù)判斷.

. 存儲(chǔ)機(jī)制

1. 存儲(chǔ)方式.session 默認(rèn)是文件存儲(chǔ)的。我們可以通過(guò) php.ini 的配置來(lái)設(shè)置存儲(chǔ)驅(qū)動(dòng)傳送門

2. 生命周期。當(dāng)我們未設(shè)置 session 的生命周期時(shí),當(dāng)瀏覽器關(guān)閉之后存儲(chǔ)在客戶端的 phpsessid 自動(dòng)消失,因?yàn)樗谴嬖趦?nèi)存,下次建立連接的時(shí)候會(huì)重新創(chuàng)建一個(gè) phpsessid. 之前的 session,PHP 會(huì)自動(dòng)的根據(jù)垃圾回收機(jī)制自動(dòng)刪除。這里我們可以根據(jù) session_set_cookie_params ($expire) 函數(shù)來(lái)設(shè)置一個(gè)生命周期;

session 的設(shè)置

session_start();
$_SESSION = $values;

. session_start () 設(shè)置之前,不能有任何輸出

session 的獲取

$_SESSION['values'];

session 的刪除

// 只是單純的給重新賦了一個(gè)空的值
$_SESSION['values'] = '';
// 該函數(shù)是清空所有的session,慎用!
session_destroy();
// 連values這個(gè)session鍵都會(huì)刪除
unset($_SESSION['values']);

session 的使用場(chǎng)景

. 用戶身份識(shí)別

. 數(shù)據(jù)傳輸

. 登錄控制 (是否登錄、單點(diǎn)登錄)

session 的注意事項(xiàng)

. 安全性,sessionid 是按照一定的算法生成,要保證 session 的值唯一性和隨機(jī)性.

. 客戶端禁用 cookie,根據(jù)上面 session 的運(yùn)行原理可以得出,session 的存儲(chǔ)于傳送還是依賴于客戶端,因此當(dāng)客戶端禁用 cookie 時(shí),客戶端是無(wú)法保存 PHPSESSID 的,這時(shí)候可以通過(guò) url 重寫或者表單來(lái)實(shí)現(xiàn) session 的傳輸.

. 存儲(chǔ)優(yōu)化,按照上面的 session 創(chuàng)建,所有的 session 都會(huì)創(chuàng)建在一個(gè)目錄下面,同時(shí)有的無(wú)效 session 在垃圾回收機(jī)制時(shí)間內(nèi)還不會(huì)刪除,當(dāng)一臺(tái)服務(wù)器配置的站點(diǎn)較多時(shí),這時(shí)候會(huì)生成很多的 session 文件,導(dǎo)致我們讀取速度變慢,我們可以設(shè)置 session 的存儲(chǔ)目錄級(jí)別,save_path 函數(shù). 一般大型的項(xiàng)目 (如分布式的項(xiàng)目), 可以使用其他的存儲(chǔ)方式,如數(shù)據(jù)存儲(chǔ),內(nèi)存存儲(chǔ).

session 與 cookie 的區(qū)別

. session 存儲(chǔ)在服務(wù)端,cookie 存儲(chǔ)在客戶端.

.cookie 的創(chuàng)建指令由服務(wù)端設(shè)置.

.session 的 sessionid 需要客戶端存儲(chǔ).

cookie 與 session 的幾個(gè)誤區(qū)

. 客戶端禁止 cookie,session 無(wú)法使用?

使用url重寫或者表單提交可以實(shí)現(xiàn).

.session 和 cookie 的安全性比較,session 存在客戶端安全更高?

由于cookie是存在客戶端的,相對(duì)來(lái)說(shuō)安全性是要低一些,不過(guò)在創(chuàng)建的時(shí)候可以設(shè)置$httpOnly值.

由于cookie與session是相互關(guān)聯(lián)的,獲取到cookie一定程度上獲取到了session,同樣可以操作session.

.cookie 與 session 是不是在瀏覽器關(guān)閉的時(shí)候會(huì)消失?

這需要查看存儲(chǔ)機(jī)制了。cookie可以存文件,內(nèi)存,flash.存內(nèi)存當(dāng)然瀏覽器關(guān)閉則消失了;session由于垃圾回收機(jī)制,當(dāng)在垃圾回收機(jī)制內(nèi)是不會(huì)刪除的,除非你代碼中顯示的做了刪除操作.

.cookie 是存儲(chǔ)在客戶端中,如何增加其安全性?

我們可以在設(shè)置cookie的時(shí)候,增加一些特殊參數(shù),如客戶端信息ip、瀏覽器信息等.

. 當(dāng) cookie 存在客戶端的文件中,是不是每個(gè)瀏覽器獲取到這個(gè)文件都可以進(jìn)行操作?

要看瀏覽器之間對(duì)cookie的管理機(jī)制是不是一樣.

以上是PHP中session 與 cookie是什么的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI