小程序接口無法傳遞session校驗驗證碼


今天在寫接口的時候發現一個問題,我用apiaaz測試一切正常,但是從小程序接口請求驗證碼,一直驗證失敗。

最開始用的圖形驗證碼,查閱了不少資料,最后懷疑是cookie的問題,解決無果,換成了短信驗證碼

換成短信驗證碼之后,我用apiaaz測試一切正常,小程序請求的時候還是不正常,確定了驗證碼無誤之后

我在控制器里把所有的參數都打印出來,以及session,然后發現session為Null,我又用apiaaz測試了一下

可以登陸,那為什么我可以登陸,小程序不行呢?又查閱了資料,終於找到了答案

普通的Web開發,都是把sessionid保存在cookie中傳遞的。

不管是java還是php,服務端的會在response的header中加上Set-Cookie

Response Headers
Content-Type:application/json;charset=UTF-8
Date:Mon, 02 Apr 2018 16:02:42 GMT
Set-Cookie:JSESSIONID=781C7F500DFA24D663BA243A4D9044BC;path=/yht;HttpOnly

瀏覽器的請求也會在header中加上

Request Headers
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:564
content-type:application/json
Cookie:JSESSIONID=781C7F500DFA24D663BA243A4D9044BC;path=/yht;HttpOnly

通過這個sessionid就能使瀏覽器端和服務端保持會話,使瀏覽器端保持登錄狀態

但是,微信小程序不能保存Cookie,導致每次wx.request到服務端都會創建一個新的會話,小程序端就不能保持登錄狀態了

一個比較簡單的辦法就是在小程序端把cookie保存到storage里,后續請求的時候再讀storage,把cookie添加到請求頭里,這樣做的好處就是,服務端不用做任何改動

具體操作如下:

1、在小程序里把服務端response的Set-Cookie中的值保存到Storage中

wx.request({
    url: path,
    method:method,
    header: header,
    data:data,
    success:function(res){
        if(res && res.header && res.header['Set-Cookie']){
            wx.setStorageSync('cookieKey', res.header['Set-Cookie']);//保存Cookie到Storage
          }
},
    fail:fail
  })

2、wx.request再從Storage中取出Cookie,封裝到header中

  let cookie = wx.getStorageSync('cookieKey');
  let path=conf.baseurl+url;
  let header = { };
  if(cookie){
    header.Cookie=cookie;
  }
  
  wx.request({
    url: path,
    method:method,
    header: header,
    data:data,
    success:success,
    fail:fail
  })

寫法可能不太相同,但是重要的是思路,就是需要小程序端獲取Set-Cookie中的值,在請求的時候攜帶在header中,這樣就能保持會話啦。

參考:https://www.jianshu.com/p/5c928e0df024


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM