在 Laravel 的配置文件 config/session.php 中能夠設置 Session Cookie Name,好比這個項目中設置名稱爲「sns_session」:php
/* |-------------------------------------------------------------------------- | 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,名字就是咱們自定義的。laravel
這個 sessionid 就是 cookie 和 session 聯繫的橋樑,服務器經過這個 sessionid 判斷來自哪一個客戶端的請求。web
可是,每次刷新頁面,這個 cookie 值都會發生改變!那麼這樣服務器如何保持會話呢?由於你的 sessionid 老是在變。segmentfault
咱們在 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 中間件。websocket
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 的時候會被解密回去。cookie
Laravel 框架這樣設計的目的多是爲了防止 session 劫持吧!考慮仍是比較全面的!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() 函數。
(本文爲小談博客原創,轉載請註明出處!原文地址:https://blog.tanteng.me/2017/...)
你們好,個人新課程《圖解HTTP精華解讀》開始報名了
報名地址:https://segmentfault.com/l/15...
本次課程內容是對《圖解HTTP》這本書的精華解讀,不管你是否讀過這本書,咱們能夠一塊兒全面梳理一下關於 HTTP 的知識點。
不只是對這本書的知識總結,同時也會結合工做和我的理解從不一樣角度講解 HTTP 的知識,重點補充 websocket 的應用以及 HTTP/2 的介紹
但願加深對 HTTP 協議瞭解的人,或全面梳理複習 HTTP 知識點的人
理解比較簡單,但知識點不少,內容很重要
讓咱們一塊兒開啓 HTTP 之旅!