微信小程序后端无法保持会话的原因及解决办法问题

  

之前未接触过微信小程序项目,在使用jQuery库的ajax中很正常,服务器也能保持会话状态。在使用wx.request中发现会话一直不能保持,一开始以为是服务器php。ini配置错误,
  

  
      <李>在代码中加入session_start()或者开启session.auto_start()   <李>确认session.save_path配置正确且有读写权限   
  

的情况下仍无效果。以上方法确实可以解决大多数情况下的页面刷新会话无法保持问题。
  

  

但是在设置之后都没有效果。

  

最后发现,原来是jQuery的ajax(应该是浏览器)会自动维护cookie,而wx。请求不会。
  这涉及到会话与饼干的关系及保存机制的问题。

  

首先,饼干是保存在客户端的信息,而会话是保存在服务器的信息。

  

那服务器如何识别单独用户的会话,在一次连接下,如何判别该用户是属于哪一个会话。
  机制是,服务器生成一个sessionid辨别用户,并在相应中带的饼干上该sessionid值。在用户下一次请求时,请求头中cookie理应也带上该sessionid,以便服务器辨别用户会话。其中辨别机制和会话存储机制涉及到序列和反序列化,在session.save_path中,为每一个会话单独创建一个文件,文件名为sessionid,内容则是此次会话保存的会话。

  

而wx.request并不会在请求中带上饼干,所以导致每次请求都被服务器分配一个新的sessionid,造成会话不能保持的后果。

  

  

应在wx.request中带上该sessionid,或者重新封装wx.request。

  

2019/9/27更新:
  自己维护一个头,在天气。请求中保存和发送饼干。
  首先在app.js中存储一个全局变量,存放头。

        globalData: {   标题:{   “内容类型”:“应用程序/x-www-form-urlencoded”,   “饼干”:“   }   }      

然后在每一次的天气。中要求的请求参数中带上该头。
  在每一次响应中检测并保存饼干到头。

        wx.request ({   url:“http://localhost/loginDemo/server/loginTest.php”,//带上请求头   .globalData.header头:getApp (),   方法:“文章”,   数据:{   行动:“登录”,   用户:that.data.userInfo.nickName   },   成功:函数(res) {   console.log (res)//dosometing……//判断后端响应中有没有set - cookie值,有即是后端需要设置饼干,在此例中后端设置会话id   如果(res.header (set - cookie”) !=null) {//设置饼干   .globalData getApp ()。标题(“饼干”)+=res.header (set - Cookie”)   }   },   失败:函数(res) {   console.log (res)   wx.showToast ({   标题:“连接服务器失败”,   图标:“没有”   })   }   })      

测试   

微信小程序后端无法保持会话的原因及解决办法问题

  

第一次请求,本地(头)没有饼干存储的PHPSESSIONID。
  

  

微信小程序后端无法保持会话的原因及解决办法问题“> <br/>
  </p>
  <p>第一次请求响应,服务器返回set - cookie,带上phpsessionID。<br/>
  自己维护,存储到标题中。<br/>
  </p>
  <p> <img src=微信小程序后端无法保持会话的原因及解决办法问题