Laravel中的Sessionid處理機(jī)制詳解
前言
本文主要給大家介紹了關(guān)于Laravel中Sessionid處理機(jī)制的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(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',
我們可以看到刷新頁面,查看 cookie,會發(fā)現(xiàn)一個(gè)名稱為 sns_session 的 cookie,名字就是我們自定義的。
這個(gè) sessionid 就是 cookie 和 session 聯(lián)系的橋梁,服務(wù)器通過這個(gè) sessionid 判斷來自哪個(gè)客戶端的請求。
Laravel 的 sessionid 每次刷新發(fā)生變化
但是,每次刷新頁面,這個(gè) cookie 值都會發(fā)生改變!那么這樣服務(wù)器如何保持會話呢?因?yàn)槟愕?sessionid 總是在變。

Laravel 對 cookie 進(jìn)行加密
我們在 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));
}
每次刷新頁面,這個(gè) Store 對象的 id 屬性其實(shí)是沒有變化的,這個(gè)屬性就是 sessionid 這個(gè) cookie 的值。也就是說,sessionid 的值并不是每次發(fā)生變化,而是寫 cookie 的時(shí)候,值發(fā)生了變化。

在 vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php 中的 encrypt 方法找到了原因,這個(gè)中間件對所有 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í)候會被解密回去。
Laravel 框架這樣設(shè)計(jì)的目的可能是為了防止 session 劫持吧!考慮還是比較全面的!
其他補(bǔ)充知識
原生 PHP 設(shè)置 session 名稱
session_name() 函數(shù):
<?php
/* 設(shè)置會話名稱為 WebsiteID */
$previous_name = session_name("WebsiteID");
echo "The previous session name was $previous_name<br />";
?>
session_name() 函數(shù)返回當(dāng)前會話名稱。 如果指定 name 參數(shù), session_name() 函數(shù)會更新會話名稱, 并返回 原來的 會話名稱。
請求開始的時(shí)候,會話名稱會被重置并且存儲到 session.name 配置項(xiàng)。 因此,要想設(shè)置會話名稱,那么對于每個(gè)請求,都需要在 調(diào)用 session_start() 或者 session_register() 函數(shù) 之前調(diào)用 session_name() 函數(shù)。
COOKIE和SESSION的區(qū)別和關(guān)系
- COOKIE保存在客戶端,而SESSION則保存在服務(wù)器端
- 從安全性來講,SESSION的安全性更高
- 從保存內(nèi)容的類型的角度來講,COOKIE只保存字符串(及能夠自動(dòng)轉(zhuǎn)換成字符串)
- 從保存內(nèi)容的大小來看,COOKIE保存的內(nèi)容是有限的,比較小,而SESSION基本上沒有這個(gè)限制
- 從性能的角度來講,用SESSION的話,對服務(wù)器的壓力會更大一些
- SEEION依賴于COOKIE,但如果禁用COOKIE,也可以通過url傳遞
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
- 跟我學(xué)Laravel之請求(Request)的生命周期
- 三個(gè)思路解決laravel上傳文件報(bào)錯(cuò):413 Request Entity Too Large問題
- Laravel學(xué)習(xí)教程之request validation的編寫
- 跟我學(xué)Laravel之視圖 & Response
- 關(guān)于擴(kuò)展 Laravel 默認(rèn) Session 中間件導(dǎo)致的 Session 寫入失效問題分析
- Laravel5.2使用Captcha生成驗(yàn)證碼實(shí)現(xiàn)登錄(session巨坑)
- laravel獲取不到session的三種解決辦法【推薦】
- Laravel如何使用Redis共享Session
- Laravel 5.4.36中session沒有保存成功問題的解決
- 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í)例,有對這方面不懂的同學(xué)可以參考下2021-01-01
Laravel 5.5中為響應(yīng)請求提供的可響應(yīng)接口詳解
這篇文章主要給大家介紹了關(guān)于Laravel 5.5中為響應(yīng)請求提供的可響應(yīng)接口的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
PHP二維數(shù)組矩形轉(zhuǎn)置實(shí)例
下面小編就為大家?guī)硪黄狿HP二維數(shù)組矩形轉(zhuǎn)置實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07
PHP實(shí)現(xiàn)留言板功能的詳細(xì)代碼
這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)留言板功能的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03

