亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

關于擴展 Laravel 默認 Session 中間件導致的 Session 寫入失效問題分析

2020-03-22 18:34:37
字體:
來源:轉載
供稿:網友
PHP 關于擴展 Laravel 默認 Session 中間件導致的 Session 寫入失效問題分析
最近由于項目開發需要,手機客戶端和網頁端統一使用一套接口,為保證 會話(Session) 能夠正常且在各類情況下兼容,我希望能夠改變 SessionID 的獲取方式。默認情況下,所有網站都是通過 HTTP 請求的 Header 頭部中的 html' target='_blank'>Cookie 實現的,通過 Cookie 中指定的 SessionID 來關聯到服務端對應數據,從而實現會話功能。但對于手機客戶端,可能并不會支持原始的 Cookie,亦或者根據平臺需要而屏蔽,因此開發中要求通過增加一個請求頭 X-Session-Token 來標識 SessionID。在 Laravel 框架中,實現 Session 初始化、讀取和啟動,都是通過 Illuminate/Session/Middleware/StartSession 這個中間件實現的,該中間件有一個關鍵方法 getSession ,這個方法就是獲取 SessionId 從而告知 Session 組件以什么憑據恢復 Session 數據。該中間件注冊于 app/Http/Kernel.php 文件下。我新建了一個類繼承該中間件,同時替換了在 app/Http/Kernel.php 下的注冊的地方,原來的 getSession 方法源碼如下:public function getSession(Request $request)$session = $this- manager- driver();$session- setId($request- cookies- get($session- getName()));return $session;}在新的中間件中,我修改為:public function getSession(Request $request)$session = $this- manager- driver();// 判斷是否是接口訪問并根據實際情況選擇 SessionID 的獲取方式if ($request- headers- has('x-session-token')) {$sessionId = $request- headers- has('x-session-token');} else {$sessionId = $request- cookies- get($session- getName());$session- setId($sessionId);return $session;但是麻煩也隨之而來。。。修改完后,推送至分支,在合并至主開發分支之前往往需要跑一下單元測試,不幸的是,之前通過的 Case 這回竟然報錯,問題是 CSRF 組件 報出 Token 錯誤,而我們在這一處提供的 Token 跟平時并無二致,問題肯定出在 Session 上。值得注意的是,我修改中間件的代碼,對框架的影響可以說根本沒有,事實上也確實沒有,因為我將我自己創建的中間件代碼修改成繼承的中間件代碼一致也無濟于事,但奇怪的是,在我將中間件換回原來的中間件就沒有這個問題。于是我將正常情況下和非正常情況下的代碼都跑了一遍,在關鍵處斷點調試,發現問題出在中間件的一個重要屬性 $sessionHandled , 若該值為 false 則會引起我們之前的狀況。關鍵在于,中間件啟動之時,都會走 handle 方法,而對于 Session 這個中間件, handle 方法的第一行代碼就是:$this- sessionHandled = true;Interesting。。。我們知道。Laravel 框架的特色是其 IoC 容器,框架中初始化各種類都是由其負責以實現各種依賴注入,以保證組件間的松耦合。中間件定然不例外。要知道,單例和普通實例最大的區別在于無論創建多少次,單例永遠都是一個,實例中的屬性不會被初始化,因此無問題的中間件必然是一個單例,而我自己創建的中間件只是個普通的類的實例。但本著知其然更要知其所以然,我需要確認我這一想法(其實解決辦法已經想到了,后面說)。那么問題大致就在于初始化中間件這塊了,于是不得不打起精神,仔細理一下 Laravel 的啟動代碼。而這里面的重點,在于一個叫 Illuminate/Pipeline/Pipeline 的類。
這個類有三個重要方法 send 、 through 、 then 。其中 then 是開始一切的鑰匙。這個類主要是連續執行幾個框架啟動步驟的玩意兒,首先是初始化處理過程需要的組件(Request 和 中間件),其次是將請求通過這些處理組件構成的堆棧(一堆中間件和路由派發組件),最后是返回處理結果(Response)??梢哉f這玩意兒是 Laravel Http 部分的核心(額,,本來就是 Kernel)。那么之前的問題就在于 Pipeline 的 then 方法和其調用的 getSlice 方法,直接觀察 getSlice 方法,可以發現它負責的是生成處理堆棧,并實例化 Middleware (中間件)類,整個方法代碼如下:protected function getSlice()return function ($stack, $pipe) {return function ($passable) use ($stack, $pipe) {if ($pipe instanceof Closure) {return call_user_func($pipe, $passable, $stack);} else {list($name, $parameters) = $this- parsePipeString($pipe);return call_user_func_array([$this- container- make($name), $this- method],array_merge([$passable, $stack], $parameters));}可以注意到 $this- container- make($name) ,這意味著其初始化一個中間件類,單純的就是 make,若其不是單例則反復 new ,導致之前的屬性被初始化。
那么解決辦法也顯而易見面,使其成為一個單例。我在 app/Providers/AppServiceProvider.php 的 register 方法中添加如下一行代碼,就解決了之前的問題:$this- app- singleton(SessionStart::class); // SessionStart 是我那個中間件類名以上給大家介紹了擴展 Laravel 默認 Session 中間件導致的 Session 寫入失效問題分析的全部內容,希望大家喜歡。PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品va在线观看| 在线日韩日本国产亚洲| 91美女片黄在线观| 亚洲精品中文字幕有码专区| 欧美性开放视频| 日韩精品中文字幕在线观看| 日韩精品极品毛片系列视频| 这里只有视频精品| 欧美日韩国产精品一区二区不卡中文| 午夜免费在线观看精品视频| 韩国视频理论视频久久| 久久久久久久久亚洲| 国产欧美日韩精品丝袜高跟鞋| 日韩av在线电影网| 毛片精品免费在线观看| 97国产在线视频| 国产精品成人品| 国内精品久久久| 中文字幕久久久| 一本一本久久a久久精品综合小说| 久久综合伊人77777尤物| 91在线免费观看网站| 91精品成人久久| 国产精品综合不卡av| 国产亚洲aⅴaaaaaa毛片| 成人激情视频在线| 国产精品视频久| 色噜噜狠狠狠综合曰曰曰88av| 亚洲国产精品推荐| 在线观看精品自拍私拍| 另类少妇人与禽zozz0性伦| 亚洲另类激情图| 成人精品在线视频| 92国产精品久久久久首页| 欧美夫妻性生活xx| 国产成人精品免高潮在线观看| www.亚洲一二| 国产成人涩涩涩视频在线观看| xxav国产精品美女主播| 国产一区二区美女视频| 欧美日韩国产精品一区二区三区四区| 欧美老少配视频| 69影院欧美专区视频| 日韩最新中文字幕电影免费看| 欧美精品成人91久久久久久久| 国产精品久久久久久久久久久久久| 久久久久国产一区二区三区| 久久久免费在线观看| 91在线色戒在线| 日韩电影免费观看中文字幕| 精品国产精品三级精品av网址| 国产精品免费一区二区三区都可以| 91青草视频久久| 97超碰蝌蚪网人人做人人爽| 亚洲欧美日韩在线高清直播| 欧美大片在线看| 国产精品欧美一区二区| 国产日韩av高清| 精品自拍视频在线观看| 日韩高清不卡av| 久久免费成人精品视频| 日韩av一区二区在线| 视频一区视频二区国产精品| 国产精品女主播| 97在线看免费观看视频在线观看| 欧美尤物巨大精品爽| 日韩在线免费视频观看| 久久精品国产一区| 亚洲福利精品在线| 国产精品一区二区久久久| 精品夜色国产国偷在线| 日韩av电影手机在线观看| 国产精品第七影院| 久久成人人人人精品欧| xxxx性欧美| 91精品国产高清久久久久久91| 欧美日本中文字幕| 欧美国产日韩一区二区| 欧美性视频精品| 91av视频在线免费观看| 久久久精品视频在线观看| 4444欧美成人kkkk| 精品国产精品自拍| 91久久国产综合久久91精品网站| 在线国产精品播放| 亚洲精品av在线播放| 91免费视频网站| 色综合久久中文字幕综合网小说| 久久久噜噜噜久噜久久| 色777狠狠综合秋免鲁丝| 色99之美女主播在线视频| 日韩精品www| 亚洲伊人成综合成人网| 久久国产精品电影| 国产精品流白浆视频| 国产亚洲人成a一在线v站| 国产做受69高潮| 国产精品美女久久久免费| 91在线|亚洲| 亚洲最大av在线| 欧美中文在线观看国产| 国产在线999| 国产精品网红直播| 2025国产精品视频| 久久精品视频导航| 91免费在线视频| 亚洲а∨天堂久久精品喷水| 久久视频在线观看免费| 国产91ⅴ在线精品免费观看| 日韩精品在线影院| 欧美精品xxx| 欧美日韩激情网| 欧美老女人bb| 亚洲第一精品久久忘忧草社区| 亚洲夜晚福利在线观看| 久久久精品一区| 欧美裸体视频网站| 国产伊人精品在线| 91av视频在线观看| 欧美在线观看一区二区三区| 国产精品吹潮在线观看| 97精品在线观看| 欧美性生交大片免费| 欧美在线性爱视频| 亚洲成人网在线观看| 亚洲国产精品福利| 亚洲精品国产精品国自产观看浪潮| 91视频九色网站| 黑人精品xxx一区一二区| 国产精品久久久久久久久久东京| 亚洲美女中文字幕| 国内精品400部情侣激情| 久久精品99无色码中文字幕| 欧美激情欧美狂野欧美精品| 欧美性20hd另类| 国产精品国产三级国产aⅴ浪潮| 久久久国产成人精品| 欧美激情精品久久久久久| 日韩精品免费电影| 欧美理论电影在线播放| 在线看日韩欧美| 欧美日韩国产一区中文午夜| 永久免费毛片在线播放不卡| 98午夜经典影视| 国产91精品久久久久久| 在线观看国产精品淫| 国产精品男女猛烈高潮激情| 久久久免费在线观看| 日本免费久久高清视频| 欧美成在线视频| www.日韩不卡电影av| 国产精品jvid在线观看蜜臀| 91免费福利视频| 亚洲国产精品一区二区久| 亚洲男人天堂九九视频| 亚洲欧洲成视频免费观看| 午夜精品久久17c| 欧美激情一区二区三区久久久| 高清欧美一区二区三区| 最近中文字幕2019免费| 狠狠综合久久av一区二区小说| 欧美国产日韩一区二区三区| 国产盗摄xxxx视频xxx69| 18久久久久久|