关注web技术发展
用心做好每一件事

解决小程序不能存取cookie无法处理session的问题

微信小程序自带的授权太麻烦,没搞明白结合我自己的业务处理session,只用它处理微信的那一套,授权获取用户信息,获取openid等,自己的业务逻辑都走的自己的session,我服务端用的是koa2session中间件用的是koa-session-minimal && koa-mysql-session 跟大多数框架处理session问题一样,服务端向客户端种下cookie,客户端请求会带给服务端。
对于前后端分离项目无法跨域种cookie怎么处理,前一篇nodejs(koa2)+vue2前后端分离项目解决session跨域丢失问题给了解决方法,但是小程序没有浏览器,没有bom,dom,怎么处理呢?
开始的思路是后端把sessionid以参数的形式在登录的时候返回给客户端,客户端自己存储,然后在请求的时候再以参数的形式带上来,服务端再处理,这也是app通用的做法,但是在我的项目中需要改中间件,最后还是放弃了
采取了下面的做法,在查资料过程中,小程序中虽然不能存取cookie,但是我发现wx.request请求回来的数据header中是可以拿到服务端返回的sessionid的,同样发送请求也可以设置header请求头的。
于是有了下面的方法:服务端不需要修改session机制
小程序端处理:

每次登陆前先清除sessionid,然后从header中获取存储到本地

wx.login({
    success:function(rs){
        wx.removeStorageSync('sessionid') //必须先清除,否则res.header['Set-Cookie']会报错
        api.getData(`/op/wxLogin?code=${rs.code}`,"POST",res.userInfo).then((res)=>{
            //登录&&创建用户
            let sessionid = res.header['Set-Cookie']
            sessionid = sessionid.match(/=(\S*);/)[1]
            wx.setStorageSync('sessionid',sessionid)
        })
    }
})

在封装的请求中再把sessionid写入header头中带上去,我把wx.request二次封装了,代码全贴出来

module.exports.zmajax = function (url) {
    var method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'POST';
    var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
    var header = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { 'content-type': 'application/json' };
    var Host = 'http://192.168.2.113:8086'
    var session_id = wx.getStorageSync('sessionid');//本地取存储的sessionid 
    if (session_id != "" && session_id != null) {  
        header = { 'content-type': 'application/json', 'Cookie': 'sessionid=' + session_id }  
    } 
    return new Promise(function (resolve, reject) {
       wx.request({
          url: Host + url,
          data: data,
          method: method,
          header: header,
          withCredentials:true,
          success: function (res) {
              resolve(res)
          },
          fail: function (res) {
              reject(res)
          }
      })
    })
}

好了,到这里服务端就可以正常获取session了

分享到: 更多 (0)

我要点评 抢沙发

评论前必须登录!