微信小程式後端無法保持session的原因及解決辦法問題
之前未接觸過微信小程式專案,在使用jQuery庫的ajax中很正常,伺服器也能保持會話狀態。在使用wx.request中發現會話一直不能保持,一開始以為是伺服器php.ini配置錯誤,
- 在程式碼中加入session_start()或者開啟session.auto_start()
- 確認session.save_path配置正確且有讀寫許可權
的情況下仍無效果。以上方法確實可以解決大多數情況下的頁面重新整理session無法保持問題。
但是在設定之後都沒有效果。
最後發現,原來是jQuery的ajax(應該是瀏覽器)會自動維護cookie,而wx.request不會。
這涉及到session與cookie的關係及儲存機制的問題。
首先,cookie是儲存在客戶端的資訊,而session是儲存在伺服器的資訊。
那伺服器如何識別單獨使用者的session,在一次連線下,如何判別該使用者是屬於哪一個session。
機制是,伺服器生成一個sessionid辨別使用者,並在相應中的cookie帶上該sessionid值。在使用者下一次請求時,請求頭中cookie理應也帶上該sessionid,以便伺服器辨別使用者會話。其中辨別機制和session儲存機制涉及到序列和反序列化,在session.save_path中,為每一個session單獨建立一個檔案,檔名為sessionid,內容則是此次會話儲存的session。
而wx.request並不會在請求中帶上cookie,所以導致每次請求都被伺服器分配一個新的sessionid,造成會話不能保持的後果。
解決辦法
應在wx.request中帶上該sessionid,或者重新封裝wx.request。
2019/9/27更新:
自己維護一個header,在wx.request中儲存和傳送Cookie。
首先在app.js中儲存一個全域性變數,存放header。
globalData: { header: { "content-type": "application/x-www-form-urlencoded",'Cookie': '' } }
然後在每一次wx.request中的請求引數中帶上該header。
在每一次響應中檢測並儲存Cookie到header。
wx.request({ url: 'http://localhost/loginDemo/server/loginTest.php',//帶上請求頭 header: getApp().globalData.header,method: 'POST',data: { action: "login",user: that.data.userInfo.nickName },success: function(res){ console.log(res) //dosometing... //判斷後端響應中有沒有set-cookie值,有即是後端需要設定cookie,在此例中後端設定session id if (res.header["Set-Cookie"] != null) { //設定cookie getApp().globalData.header["Cookie"] += res.header["Set-Cookie"] } },fail: function (res) { console.log(res) wx.showToast({ title: '連線伺服器失敗',icon: "none" }) } })
測試
第一次請求,本地(header)沒有Cookie儲存的PHPSESSIONID。
第一次請求響應,伺服器返回Set-Cookie,帶上phpsessionID。
自己維護,儲存到header中。
第二次請求帶上header,有sessionID。
第二次請求響應伺服器檢測到session,恢復會話,不建立新的會話。
以上方法基本能解決微信小程式Cookie問題。更多相關小程式後端無法保持session內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!