Laravel中的Sessionid處理機(jī)制詳解
前言
本文主要給大家介紹了關(guān)于Laravel中Sessionid處理機(jī)制的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
在 Laravel 的配置文件 config/session.php 中可以設(shè)置 Session Cookie Name,比如這個(gè)項(xiàng)目中設(shè)置名稱為“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è)名稱為 sns_session 的 cookie,名字就是我們自定義的。
這個(gè) sessionid 就是 cookie 和 session 聯(lián)系的橋梁,服務(wù)器通過(guò)這個(gè) sessionid 判斷來(lái)自哪個(gè)客戶端的請(qǐng)求。
Laravel 的 sessionid 每次刷新發(fā)生變化
但是,每次刷新頁(yè)面,這個(gè) cookie 值都會(huì)發(fā)生改變!那么這樣服務(wù)器如何保持會(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í)是沒有變化的,這個(gè)屬性就是 sessionid 這個(gè) cookie 的值。也就是說(shuō),sessionid 的值并不是每次發(fā)生變化,而是寫 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í)際上并沒有改變。在需要用到這個(gè) cookie 的時(shí)候會(huì)被解密回去。
Laravel 框架這樣設(shè)計(jì)的目的可能是為了防止 session 劫持吧!考慮還是比較全面的!
其他補(bǔ)充知識(shí)
原生 PHP 設(shè)置 session 名稱
session_name() 函數(shù):
<?php /* 設(shè)置會(huì)話名稱為 WebsiteID */ $previous_name = session_name("WebsiteID"); echo "The previous session name was $previous_name<br />"; ?>
session_name()
函數(shù)返回當(dāng)前會(huì)話名稱。 如果指定 name 參數(shù), session_name()
函數(shù)會(huì)更新會(huì)話名稱, 并返回 原來(lái)的 會(huì)話名稱。
請(qǐng)求開始的時(shí)候,會(huì)話名稱會(huì)被重置并且存儲(chǔ)到 session.name
配置項(xiàng)。 因此,要想設(shè)置會(huì)話名稱,那么對(duì)于每個(gè)請(qǐng)求,都需要在 調(diào)用 session_start()
或者 session_register()
函數(shù) 之前調(diào)用 session_name()
函數(shù)。
COOKIE和SESSION的區(qū)別和關(guān)系
- COOKIE保存在客戶端,而SESSION則保存在服務(wù)器端
- 從安全性來(lái)講,SESSION的安全性更高
- 從保存內(nèi)容的類型的角度來(lái)講,COOKIE只保存字符串(及能夠自動(dòng)轉(zhuǎn)換成字符串)
- 從保存內(nèi)容的大小來(lái)看,COOKIE保存的內(nèi)容是有限的,比較小,而SESSION基本上沒有這個(gè)限制
- 從性能的角度來(lái)講,用SESSION的話,對(duì)服務(wù)器的壓力會(huì)更大一些
- SEEION依賴于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的編寫
- 跟我學(xué)Laravel之視圖 & Response
- 關(guān)于擴(kuò)展 Laravel 默認(rèn) Session 中間件導(dǎo)致的 Session 寫入失效問(wèn)題分析
- Laravel5.2使用Captcha生成驗(yàn)證碼實(shí)現(xiàn)登錄(session巨坑)
- laravel獲取不到session的三種解決辦法【推薦】
- Laravel如何使用Redis共享Session
- Laravel 5.4.36中session沒有保存成功問(wèn)題的解決
- Laravel框架Request、Response及Session操作示例
相關(guān)文章
Laravel框架使用Seeder實(shí)現(xiàn)自動(dòng)填充數(shù)據(jù)功能
這篇文章主要介紹了Laravel框架使用Seeder實(shí)現(xiàn)自動(dòng)填充數(shù)據(jù)功能,結(jié)合實(shí)例形式分析了Laravel基于Seeder類實(shí)現(xiàn)自動(dòng)填充數(shù)據(jù)的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-06-06用PHP實(shí)現(xiàn)的服務(wù)端socket具體實(shí)例
這篇文章主要介紹了用PHP實(shí)現(xiàn)的服務(wù)端socket具體實(shí)例,有對(duì)這方面不懂的同學(xué)可以參考下2021-01-01Laravel 5.5中為響應(yīng)請(qǐng)求提供的可響應(yīng)接口詳解
這篇文章主要給大家介紹了關(guān)于Laravel 5.5中為響應(yīng)請(qǐng)求提供的可響應(yīng)接口的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11PHP二維數(shù)組矩形轉(zhuǎn)置實(shí)例
下面小編就為大家?guī)?lái)一篇PHP二維數(shù)組矩形轉(zhuǎn)置實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07PHP實(shí)現(xiàn)留言板功能的詳細(xì)代碼
這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)留言板功能的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03