小程式的HTTP請求全部使用wx.request({})方法,但是此方法每次都會產生一個新的會話,因此在特定使用場景(安全驗證、session保存、CSRF保護)等方面會遇到一些麻煩。例如csrf保護的應用中,即使上次拿到csrf,再下次請求中又會失效。
已取得csrf為例,簡單粗暴,在應用程式啟動時候()可以在onLaunch時候)取得第一次要求的Cookie訊息,保存在本地,以後每次在請求頭強制加上cookie資訊即可。
程式碼入下:
//app.jsApp({ onLaunch:function(){ this.initSession(); }, initSession:function(){ var that = this; // step one:get cookie wx.request({ url:'https://my.domain.com/open-api/cookie', header:{'Content-Type':'application/x-www-form-urlencoded'}, method:'GET', success:function(res){ for(let cookie of res.data){ //这里我仅保存了sessionid,根据需要,也可以保存cookie的其它信息。 if(cookie.name === 'JSESSIONID') { that.globalData.sessionId=cookie.value; wx.request({ url:'https://my.domain.com/open-api/csrf', header:{'Content-Type':'application/x-www-form-urlencoded','Cookie':'JSESSIONID='+that.globalData.sessionId}, method:'GET', success:function(res){ that.globalData.csrf=res.data; } }) break; } } } }) } })
以後,每次請求別的api接口,就可以在請求頭中添加csrf以及sessionId來維持同一個會話了。
程式碼如下:
doSth:function(){ var that = this; wx.request({ url:'my.domain.com/api/some-thing', //这里的CSRF的key(CSRF-TOKEN)具体写什么,根据各位自己的程序设置来写 header:{'Content-Type':'application/x-www-form-urlencoded','Cookie':'JSESSIONID='+that.globalData.sessionId,'CSRF-TOKEN':that.globalData.csrf}, method:'POST', data:paramdata, success:function(res){ doSomething(res.data); } }) }
以上是微信小程式的會話保持下一個失效的解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!