記介面當中使用 session 是如何被排斥的

韓槑槑發表於2018-05-21

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

相關文章