Laravel中的Sessionid處理機(jī)制詳解
前言
本文主要給大家介紹了關(guān)于Laravel中Sessionid處理機(jī)制的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
在 Laravel 的配置文件 config/session.php 中可以設(shè)置 Session Cookie Name,比如這個(gè)項(xiàng)目中設(shè)置名稱(chēng)為“sns_session”:
/* |-------------------------------------------------------------------------- | Session Cookie Name |-------------------------------------------------------------------------- | | Here you may change the name of the cookie used to identify a session | instance by ID. The name specified here will get used every time a | new session cookie is created by the framework for every driver. | */ 'cookie' => 'sns_session',
我們可以看到刷新頁(yè)面,查看 cookie,會(huì)發(fā)現(xiàn)一個(gè)名稱(chēng)為 sns_session 的 cookie,名字就是我們自定義的。
這個(gè) sessionid 就是 cookie 和 session 聯(lián)系的橋梁,服務(wù)器通過(guò)這個(gè) sessionid 判斷來(lái)自哪個(gè)客戶(hù)端的請(qǐng)求。
Laravel 的 sessionid 每次刷新發(fā)生變化
但是,每次刷新頁(yè)面,這個(gè) cookie 值都會(huì)發(fā)生改變!那么這樣服務(wù)器如何保持會(huì)話(huà)呢?因?yàn)槟愕?sessionid 總是在變。

Laravel 對(duì) cookie 進(jìn)行加密
我們?cè)?vendor/laravel/framework/src/Illuminate/Session/Store.php 的 save 方法中調(diào)試一下,打印一下這里的調(diào)用棧:
/**
* {@inheritdoc}
*/
public function save()
{
$this->addBagDataToSession();
$this->ageFlashData();
$this->handler->write($this->getId(), $this->prepareForStorage(serialize($this->attributes)));
$this->started = false;
dd(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT,5));
}
每次刷新頁(yè)面,這個(gè) Store 對(duì)象的 id 屬性其實(shí)是沒(méi)有變化的,這個(gè)屬性就是 sessionid 這個(gè) cookie 的值。也就是說(shuō),sessionid 的值并不是每次發(fā)生變化,而是寫(xiě) cookie 的時(shí)候,值發(fā)生了變化。

在 vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php 中的 encrypt 方法找到了原因,這個(gè)中間件對(duì)所有 cookie 值進(jìn)行了加密處理,它被包含在 web 中間件。
protected function encrypt(Response $response)
{
foreach ($response->headers->getCookies() as $cookie) {
if ($this->isDisabled($cookie->getName())) {
continue;
}
$response->headers->setCookie($this->duplicate(
$cookie, $this->encrypter->encrypt($cookie->getValue())
));
}
return $response;
}
而這種加密方式是每次加密的結(jié)果都不同,所以表現(xiàn)為 sessionid 的值每次都發(fā)生了變化,而實(shí)際上并沒(méi)有改變。在需要用到這個(gè) cookie 的時(shí)候會(huì)被解密回去。
Laravel 框架這樣設(shè)計(jì)的目的可能是為了防止 session 劫持吧!考慮還是比較全面的!
其他補(bǔ)充知識(shí)
原生 PHP 設(shè)置 session 名稱(chēng)
session_name() 函數(shù):
<?php
/* 設(shè)置會(huì)話(huà)名稱(chēng)為 WebsiteID */
$previous_name = session_name("WebsiteID");
echo "The previous session name was $previous_name<br />";
?>
session_name() 函數(shù)返回當(dāng)前會(huì)話(huà)名稱(chēng)。 如果指定 name 參數(shù), session_name() 函數(shù)會(huì)更新會(huì)話(huà)名稱(chēng), 并返回 原來(lái)的 會(huì)話(huà)名稱(chēng)。
請(qǐng)求開(kāi)始的時(shí)候,會(huì)話(huà)名稱(chēng)會(huì)被重置并且存儲(chǔ)到 session.name 配置項(xiàng)。 因此,要想設(shè)置會(huì)話(huà)名稱(chēng),那么對(duì)于每個(gè)請(qǐng)求,都需要在 調(diào)用 session_start() 或者 session_register() 函數(shù) 之前調(diào)用 session_name() 函數(shù)。
COOKIE和SESSION的區(qū)別和關(guān)系
- COOKIE保存在客戶(hù)端,而SESSION則保存在服務(wù)器端
- 從安全性來(lái)講,SESSION的安全性更高
- 從保存內(nèi)容的類(lèi)型的角度來(lái)講,COOKIE只保存字符串(及能夠自動(dòng)轉(zhuǎn)換成字符串)
- 從保存內(nèi)容的大小來(lái)看,COOKIE保存的內(nèi)容是有限的,比較小,而SESSION基本上沒(méi)有這個(gè)限制
- 從性能的角度來(lái)講,用SESSION的話(huà),對(duì)服務(wù)器的壓力會(huì)更大一些
- SEEION依賴(lài)于COOKIE,但如果禁用COOKIE,也可以通過(guò)url傳遞
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- 跟我學(xué)Laravel之請(qǐng)求(Request)的生命周期
- 三個(gè)思路解決laravel上傳文件報(bào)錯(cuò):413 Request Entity Too Large問(wèn)題
- Laravel學(xué)習(xí)教程之request validation的編寫(xiě)
- 跟我學(xué)Laravel之視圖 & Response
- 關(guān)于擴(kuò)展 Laravel 默認(rèn) Session 中間件導(dǎo)致的 Session 寫(xiě)入失效問(wèn)題分析
- Laravel5.2使用Captcha生成驗(yàn)證碼實(shí)現(xiàn)登錄(session巨坑)
- laravel獲取不到session的三種解決辦法【推薦】
- Laravel如何使用Redis共享Session
- Laravel 5.4.36中session沒(méi)有保存成功問(wèn)題的解決
- Laravel框架Request、Response及Session操作示例
相關(guān)文章
用PHP實(shí)現(xiàn)的服務(wù)端socket具體實(shí)例
這篇文章主要介紹了用PHP實(shí)現(xiàn)的服務(wù)端socket具體實(shí)例,有對(duì)這方面不懂的同學(xué)可以參考下2021-01-01
Yii2 hasOne(), hasMany() 實(shí)現(xiàn)三表關(guān)聯(lián)的方法(兩種)
這篇文章主要介紹了Yii2 hasOne(), hasMany() 實(shí)現(xiàn)三表關(guān)聯(lián)的方法(兩種),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
php實(shí)現(xiàn)商城購(gòu)物車(chē)的思路和源碼分析
這篇文章主要介紹了php實(shí)現(xiàn)商城購(gòu)物車(chē)的思路和源碼分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
PHP 結(jié)合 Boostrap 結(jié)合 js 實(shí)現(xiàn)學(xué)生列表刪除編輯及搜索功能
這篇文章主要介紹了PHP 結(jié)合 Boostrap 結(jié)合 js 實(shí)現(xiàn)學(xué)生列表刪除編輯以及搜索功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05
PHP設(shè)置圖片文件上傳大小的具體實(shí)現(xiàn)方法
PHP默認(rèn)的上傳限定是最大2M,想上傳超過(guò)此設(shè)定的文件,需要調(diào)整PHP、apache等的一些參數(shù)2013-10-10

