天天看點

Laravel學習筆記之Session源碼解析(下)

說明:在中篇中學習了session的CRUD增删改查操作,本篇主要學習關閉session的相關源碼。實際上,在Laravel5.3中關閉session主要包括兩個過程:儲存目前URL到session媒體中;在Response Header中存入cookie。其中,Laravel5.3把垃圾回收提前到了中間件的前置操作,中篇有聊到。OK,學習下關閉session的源碼吧先。

開發環境:Laravel5.3 + PHP7

關閉Session

首先看下

\Illuminate\Session\Middleware\StartSession::class

中間件源碼的handle()方法:

從源碼中可知關閉session做了兩件事:存儲目前URL;往Response Header中添加cookie。

OK,先看第一件事:

// \Illuminate\Session\Middleware\StartSession
    protected function storeCurrentUrl(Request $request, $session) { // 如果是GET,并且不是ajax,且route對象不能為空 if ($request->method() === 'GET' && $request->route() && ! $request->ajax()) { $session->setPreviousUrl($request->fullUrl()); } } public function setPreviousUrl($url) { // 使用中篇聊到的put()方法更新式存儲$url, // 如sentry.app:8888/session,存入到redis中的'laravel:_previous.url' $this->put('_previous.url', $url); }                

是以第一件事很簡單,OK,看下第二件事:

第二件事也很簡單,執行個體化

Symfony\Component\HttpFoundation\Cookie

,并存入到response header中。其中,執行個體化Cookie所需要的各個參數值為:

(1) $session->getName()

// $session就是\Illuminate\Session\Store對象

// 在執行個體化Store對象時,傳入的name值是讀取的app['config']['session.cookie']
// 見 \Illuminate\Session\SessionManager::buildSession() line 178
'laravel_session' = $session->getName(); 



           

(2) $session->getId()

// 在執行個體化Store時,傳入的$id=null,則在Store構造函數中使用setId()設定$id值
//看下Store::setId()源碼就知道id是随機生成的長度為40的字元串
Str::random(                

(3) $this->getCookieExpirationDate()

// config/session.php中預設expire_on_close = false, lifetime = 60
    // 表示如果浏覽器關閉session不過期,則保留60分鐘後再過期
    protected function getCookieExpirationDate() { $config = $this->manager->getSessionConfig(); return $config['expire_on_close'] ?                 

(4) $config['path']

// 預設是'/',這是設定'/session',等會看下響應頭
'/session' = $config['path']
           

(5) $config['domain']

// 這裡在config/session.php中設定成'session_domain',等會看下響應頭
'session_domain' = $config['domain']
           

(6) Arr::get($config, 'secure', false)

// 就預設值false
false = Arr::get($config, 'secure', false)
           

(7) Arr::get($config, 'http_only', true)

// 就預設值true
true = Arr::get($config, 'http_only', true)
           

這裡輸入路由

sentry.app:8888/session

(在本地環境配置你的路由)簡單輸出個字元串'session',主要看下響應頭是不是設定了配置的cookie值:

Laravel學習筆記之Session源碼解析(下)

看下響應頭設定了'laravel_session' cookie,并且'path','domain'是剛剛在session.php中設定的'/session','session_domain'值。總之,Laravel關閉session的第二件事就是給Response Header添加'laravel_session' cookie。

通過對Laravel Session的源碼分析可看出Session共分為三大步:啟動Session;操作Session;關閉Session。啟動Session包括Store執行個體化,從存儲媒體中如redis讀取session資料,和垃圾回收;操作Session包括對Session的CRUD增删改查操作;關閉Session包括存儲目前的URL和往Response Header添加Cookie。

總結:本小系列主要學習了Laravel Session的源碼,學習了Session的三大步。後續有好的技術再分享吧,到時見。

轉載于:https://www.cnblogs.com/grimm/p/8462322.html