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


Posted in Javascript onMarch 20, 2020

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

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

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

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

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

首先,cookie是保存在客户端的信息,而session是保存在服务器的信息。

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

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

解决办法

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

2019/9/27更新:
自己维护一个header,在wx.request中保存和发送Cookie。
首先在app.js中存储一个全局变量,存放header。

globalData: {
  header: {
   "content-type": "application/x-www-form-urlencoded",
   'Cookie': ''
  }
 }

然后在每一次wx.request中的请求参数中带上该header。
在每一次响应中检测并保存Cookie到header。

wx.request({
   url: 'http://localhost/loginDemo/server/loginTest.php',
   //带上请求头
   header: getApp().globalData.header,
   method: 'POST',
   data: {
    action: "login",
    user: that.data.userInfo.nickName
   },
   success: function(res){
    console.log(res)
    //dosometing...
    //判断后端响应中有没有set-cookie值,有即是后端需要设置cookie,在此例中后端设置session id
    if (res.header["Set-Cookie"] != null) {
     //设置cookie
     getApp().globalData.header["Cookie"] += res.header["Set-Cookie"]
    }
   },
   fail: function (res) {
    console.log(res)
    wx.showToast({
     title: '连接服务器失败',
     icon: "none"
    })
   }
  })

测试

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

第一次请求,本地(header)没有Cookie存储的PHPSESSIONID。

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

第一次请求响应,服务器返回Set-Cookie,带上phpsessionID。
自己维护,存储到header中。

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

第二次请求带上header,有sessionID。

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

第二次请求响应服务器检测到session,恢复会话,不创建新的会话。

以上方法基本能解决微信小程序Cookie问题。更多相关小程序后端无法保持session内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
PHP 与 js的通信(via ajax,json)
Nov 16 Javascript
javascript列表框操作函数集合汇总
Nov 28 Javascript
js中哈希表的几种用法总结
Jan 28 Javascript
可编辑下拉框的2种实现方式
Jun 13 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
Dec 08 Javascript
JavaScript中的普通函数与构造函数比较
Apr 07 Javascript
JS判断iframe是否加载完成的方法
Aug 03 Javascript
JavaScript实现倒计时跳转页面功能【实用】
Dec 13 Javascript
JS获取多维数组中相同键的值实现方法示例
Jan 06 Javascript
详解js模板引擎art template数组渲染的方法
Oct 09 Javascript
ES6中new Function()语法及应用实例分析
Feb 19 Javascript
浅谈node.js中间件有哪些类型
Apr 29 Javascript
js 闭包深入理解与实例分析
Mar 19 #Javascript
JS一次前端面试经历记录
Mar 19 #Javascript
jQuery实现点击滚动到指定元素上的方法分析
Mar 19 #jQuery
浅析TypeScript 命名空间
Mar 19 #Javascript
JavaScript计算出两个数的差值
Mar 19 #Javascript
JavaScript利用键盘码控制div移动
Mar 19 #Javascript
js实现百度登录窗口拖拽效果
Mar 19 #Javascript
You might like
制作美丽的拉花
2021/03/03 冲泡冲煮
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
Yii2实现自定义独立验证器的方法
2017/05/05 PHP
JavaScript延迟加载
2021/03/09 Javascript
jQuery的一些注意
2006/12/06 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
nodejs实现获取某宝商品分类
2015/05/28 NodeJs
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
使用Node.js实现HTTP 206内容分片的教程
2015/06/23 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
原生js实现轮播图
2017/02/27 Javascript
详解node+express+ejs+bootstrap构建项目
2017/09/27 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
python根据时间获取周数代码实例
2019/09/30 Python
Pytorch之finetune使用详解
2020/01/18 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
纯css3实现图片翻牌特效
2015/03/10 HTML / CSS
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
室内设计实习自我鉴定
2013/09/25 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
党小组意见范文
2015/06/08 职场文书
2019年“红色之旅”心得体会1000字(3篇)
2019/09/27 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python