微信小程序后端无法保持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如何判断客户端是PC还是手持设备简单分析
Nov 22 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
Jul 29 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
Oct 01 Javascript
简单实现js选项卡切换效果
Feb 03 Javascript
谈一谈javascript中继承的多种方式
Feb 19 Javascript
javascript html实现网页版日历代码
Mar 08 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
Nov 17 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
Dec 08 Javascript
详解vue 数据传递的方法
Apr 19 Javascript
VuePress 静态网站生成方法步骤
Feb 14 Javascript
js实现简单的随机点名器
Sep 17 Javascript
OpenLayers3实现测量功能
Sep 25 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中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
js验证表单第二部分
2006/11/25 Javascript
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
2014/02/11 Javascript
javascript得到当前页的来路即前一页地址的方法
2014/02/18 Javascript
JS判断文本框内容改变事件的简单实例
2014/03/07 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
WINDOWS域的具体实现方式是什么
2014/02/20 面试题
如何用JQuery进行表单验证
2013/05/29 面试题
经典毕业生求职信
2014/07/12 职场文书
公司人事任命通知
2015/04/20 职场文书
行政处罚决定书
2015/06/24 职场文书
新学期感想
2015/08/10 职场文书
nginx配置虚拟主机的详细步骤
2021/07/21 Servers