小程序的HTTP请求全部使用wx.request({})方法,但是该方法每次都会产生一个新的会话,因此在特定使用场景(安全验证、session保存、CSRF保护)等方面会遇到一些麻烦。比如csrf保护的应用中,即使上次拿到csrf,再下一次请求中又会失效。
解决方法
step 1: 获取sessionId以及csrf并保存
已获取csrf为例,简单粗暴,在应用启动时候()可以在onLaunch时候)获取第一次请求的Cookie信息,保存在本地,以后每次在请求头强制加上cookie信息即可。
代码入下:
//app.js
App({onLaunch:function(){this.initSession();},initSession:function(){var that = this;// step one:get cookiewx.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;}}}})}
})
step 2: 根据sessionId以及csrf请求别的接口
以后,每次请求别的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);}})
}