第一次在 Laravel
的介面當中使用 Session
,受到成噸的傷害。
話不多說,直奔主題吧。
使用的程式碼是剛通過 composer create-project --prefer-dist laravel/laravel blog
安裝的。
首先先來呼叫下 Session
,路由為 api.php
中的介面路由,並在首頁 welcome.blade.php
中使用 JQuery
的 $.get()
來訪問下該介面。
訪問下看是否設定成功。
這樣應該是設定成功了吧,再加點判斷,看下客戶端能不能找到 Session
。
看下結果。
What ?為啥沒找到我的我名字呢?通過讀文件知道還有另一種寫法,我們再來嘗試下看看。
再看下結果。
Emmmm...直接報錯了,有點過分了吧。直接 Google
報錯資訊發現,Laravel
中的 Session
被封裝了,要使用 Session
必需要開啟 Session
中介軟體。而預設 api
中沒有開啟該中介軟體,如下圖所示。
大家有沒有在 web
中看到 \Illuminate\Session\Middleware\StartSession::class
這個中介軟體,從字面意思應該很清楚了吧?這個就是開啟 Session
的中介軟體,讓我們加在下面的 api
中再嘗試下。
沒報錯了,但是好像還是獲取不到上一次請求設定的 Session
啊,灰常尷尬。讓我們從客戶端獲取服務端 Session
的原理開始思考,大家應該都知道,Session
在設定時,會伴隨 Cookie
在客戶端的生成,當客戶端請求時會帶上設定好的 Cookie
,一般存的是 session_id
,服務端拿到這個 session_id
後就能順利拿到 Session
。那我們能設定只是找不到,會不會是 Cookie
出錯了呢?所以讓我們看看介面響應的 Cookie
。(PS:我設定了 .env
中的 SESSION_LIFETIME
為24小時,這裡就不多贅述了,並且為了區別,我設定了 APP_NAME
為 test
以區分 Laravel
自己生成的 Cookie
)
這裡主要看是否有 Value
和 Expires
,都有值且過期時間為1天,不存在秒過期的情況。那是為什麼呢?
各位,請仔細看 Request
中的 Cookie
與響應 Response
的 Cookie
,有沒有發現 Value
有很明顯的差別,完全不像是一個應用生成的 Cookie
,並且當你重新整理頁面時原本 Request
中的 test_session
應該替換為上一次請求中的 Response
中的 test_session
,這樣就能找到之前設定好的 Session
了,但實際是又重新生成了一個不同的 Cookie
。那麼問題很明顯了,設定 Session
返回的 Cookie
是有誤的,導致框架每次載入時,判斷這個 Cookie
為無效的並重新生成了一個新的,所以找不到之前的 Session
。
讓我們又回到中介軟體那裡。
我在 web
中又發現一個 \App\Http\Middleware\EncryptCookies::class
,字面意思,一個 Cookie
加密中介軟體。好像跟我們的問題有關係誒,我已經將它新增到 api
中,我們再試一下。
哎喲,終於好了,介面裡面使用 Session
就這樣被排斥嗎 :cry:
本作品採用《CC 協議》,轉載必須註明作者和本文連結