微信小程序后端无法保持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 相关文章推荐
js 代码集(学习js的朋友可以看下)
Jul 22 Javascript
能说明你的Javascript技术很烂的五个原因分析
Oct 28 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
Apr 04 Javascript
JavaScript正则表达式之multiline属性的应用
Jun 16 Javascript
详解JavaScript模块化开发
Dec 04 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
Jan 31 Javascript
JavaScript刷新页面的几种方法总结
Mar 28 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
Apr 04 Javascript
一次让你了解全部JavaScript的作用域
Jun 24 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
Jul 22 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
Oct 28 Javascript
详解JavaScript原型与原型链
Nov 16 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
php cookie 登录验证示例代码
2009/03/16 PHP
7个超级实用的PHP代码片段
2011/07/11 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
js 数组克隆方法 小结
2010/03/20 Javascript
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
javascript父、子页面交互技巧总结
2014/08/08 Javascript
node中socket.io的事件使用详解
2014/12/15 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
jQuery Html控件基本操作(日常收集整理)
2016/03/11 Javascript
浅谈Angular2 模块懒加载的方法
2017/10/04 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
python使用htmllib分析网页内容的方法
2015/05/08 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
Bootstrap File Input文件上传组件
2020/12/01 HTML / CSS
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
护士自荐信
2013/10/25 职场文书
大学生未来职业生涯规划书
2014/02/15 职场文书
厨师长岗位职责
2014/03/02 职场文书
社区母亲节活动记录
2014/03/06 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
个人租房协议书
2014/04/09 职场文书
地球一小时活动总结
2015/02/27 职场文书
辩护意见书
2015/06/04 职场文书
2019年最新感恩节祝福语(28句)
2019/11/27 职场文书
导游词之晋城蟒河
2019/12/12 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
Python中glob库实现文件名的匹配
2021/06/18 Python
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL