本文主要為大家介紹了Laravel中Sessionid處理機制的相關資料,文中透過範例程式碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。希望對大家有幫助。
前言
本文主要介紹給大家介紹了Laravel中Sessionid處理機制的相關內容,分享出來供大家參考學習,以下話不多說了,來一起看看詳細的介紹吧。
在Laravel 的設定檔config/session.php 中可以設定Session Cookie Name,例如這個專案中設定名稱為「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 ,會發現一個名稱為sns_session 的cookie,名字就是我們自訂的。
這個 sessionid 就是 cookie 和 session 連結的橋樑,伺服器透過這個 sessionid 判斷來自哪個客戶端的請求。
Laravel 的 sessionid 每次刷新發生變化
但是,每次刷新頁面,這個 cookie 值都會改變!那麼這樣伺服器如何保持會話呢?因為你的 sessionid 總是在變。
Laravel 對cookie 進行加密
我們在vendor/laravel/framework/src/Illuminate/ Session/Store.php 的save 方法中除錯一下,印出這裡的呼叫堆疊:
/** * {@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)); }
每次刷新頁面,這個Store 物件的id 屬性其實是沒有變化的,這個屬性就是sessionid 這個cookie 的值。也就是說,sessionid 的值並不是每次都發生變化,而是寫 cookie 的時候,值發生了變化。
在vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php 中的encrypt 方法找到了原因,這個中間件對所有cookie 值都進行了加密處理,它被包含在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; }
而這種加密方式是每次加密的結果都不同,所以表現為 sessionid 的值每次都發生了變化,而實際上並沒有改變。在需要用到這個 cookie 的時候會被解密回去。
Laravel 框架這樣設計的目的可能是為了防止 session 劫持吧!考慮還是比較全面的!
其他補充知識
原生PHP 設定session 名稱
session_name() 函數:
<?php /* 设置会话名称为 WebsiteID */ $previous_name = session_name("WebsiteID"); echo "The previous session name was $previous_name<br />"; ?>
session_name()
函數傳回目前會話名稱。 如果指定 name 參數, session_name()
函數會更新會話名稱, 並傳回 原來的 會話名稱。
請求開始的時候,會話名稱會被重置並且儲存到 session.name
設定項。 因此,要設定會話名稱,那麼對於每個請求,都需要在呼叫session_start()
或session_register()
函數之前呼叫session_name()
函數。
COOKIE和SESSION的區別和關係
#COOKIE保存在客戶端,而SESSION則保存在伺服器端
從安全性來講,SESSION的安全性更高
#從保存內容的類型的角度來講,COOKIE只保存字符字串(及能夠自動轉換成字串)
從保存內容的大小來看,COOKIE保存的內容是有限的,比較小,而SESSION基本上沒有這個限制
從效能的角度來講,用SESSION的話,對伺服器的壓力會更大一些
SEEION依賴COOKIE,但如果停用COOKIE ,也可以透過url傳遞
相關推薦:
以上是詳解Laravel中Sessionid的處理機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!