微信小程序实现Session功能及无法获取session问题的解决方法


Posted in Javascript onMay 07, 2019

因为小程序原生不支持Cookie,因此也不支持Session。

网上找到的的一些方法有缺陷,而且很多累赘,估计没有实际测试过,在此直接给出实测可用的代码。

大概思路就是借助小程序本地储存+网络请求的header可读可写来实现类似浏览器的cookies保存session功能。

直接上代码

function NetRequest({url, data, success, fail, complete, method = "POST", header = { 'Content-type': 'application/x-www-form-urlencoded' }}) {
 let session_id = wx.getStorageSync('PHPSESSID');//本地取存储的sessionID
 if (session_id != "" && session_id != null) { //本地session存在,则放到header里
  header.Cookie = session_id;
 }
 wx.request({
  url: url,
  method: method,
  data: data,
  header: header,
  success: res => {
   //发现response有Set-Cookie,说明本地的PHPSESSID需要更新或不存在:
   if(res.header["Set-Cookie"]){
    wx.setStorageSync('PHPSESSID', res.header["Set-Cookie"]);
   }
   res['statusCode'] === 200 ? success(res.data) : fail(res)
  },
  fail: fail,
  complete: complete
 })
}

其他语言的Session类似方法皆可实现。

PS:下面看下彻底解决小程序无法获取SESSION问题

最近在开发小程序,发现小程序是通过微信服务器触发我们服务器,所以每次请求获取到的session_id都不同,导致小程序中无法获取session,这样我就想如果session_id不发生变化,那么session是否可以使用呢???

查看了一下小程序的开发文档(wx.request);
发起网络请求中有一个header参数,
我们可以通过header传递一个固定参数到后台,
作为session_id,这样sesion_id不发生变化,
微信小程序中就可以使用或触发session了。

一、首先找到第一次发起网络请求的地址,将服务器返回set-cookie当全局变量存储起来

wx.request({
 ......//此处省略
 success: function(res) {
 console.log(res.header);
 wx.removeStorageSync('sessionid') //必须先清除,否则res.header['Set-Cookie']会报错
 //set-cookie:PHPSESSID=ic4vj84aaavqgb800k82etisu0; path=/; domain=.zhix.net
 // 登录成功,获取第一次的sessionid,存储起来
 // 注意:Set-Cookie(开发者工具中调试全部小写)(远程调试和线上首字母大写)
 wx.setStorageSync("sessionid", res.header["Set-Cookie"]);
 }
})

二、请求时带上将sessionid放入request的header头中传到服务器,服务器端可直接在cookie中获取

wx.request({
 ......
 header: {
 'content-type': 'application/json', // 默认值
 'cookie': wx.getStorageSync("sessionid")
 //读取sessionid,当作cookie传入后台将PHPSESSID做session_id使用
 },
 success: function(res) {
 console.log(res)
 }
})

三、后台获取cookie中的PHPSESSID,将PHPSESSID当作session_id使用

<?php
// 判断$_COOKIE['PHPSESSID']是否存在,存在则作session_id
if ($_COOKIE['PHPSESSID']) {
 session_id($_COOKIE['PHPSESSID']);
}
session_start();
echo session_id();

总结

以上所述是小编给大家介绍的微信小程序实现Session功能及无法获取session问题的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
js工具方法弹出蒙版
May 08 Javascript
JavaScript中split() 使用方法汇总
Apr 17 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
Aug 25 Javascript
js鼠标点击图片切换效果代码分享
Aug 26 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
Oct 19 Javascript
javascript产生随机数方法汇总
Jan 25 Javascript
node.js文件上传重命名以及移动位置的示例代码
Jan 19 Javascript
layer.confirm取消按钮绑定事件的方法
Aug 17 Javascript
详解webpack+ES6+Sass搭建多页面应用
Nov 05 Javascript
vue全局使用axios的方法实例详解
Nov 22 Javascript
vue+elementUI 复杂表单的验证、数据提交方案问题
Jun 24 Javascript
jQuery cookie的公共方法封装和使用示例
Jun 01 jQuery
webpack-mvc 传统多页面组件化开发详解
May 07 #Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
May 07 #Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
May 07 #Javascript
vue接入腾讯防水墙代码
May 07 #Javascript
基于Vue实现的多条件筛选功能的详解(类似京东和淘宝功能)
May 07 #Javascript
详解vue中使用protobuf踩坑记
May 07 #Javascript
Node.js一行代码实现静态文件服务器的方法步骤
May 07 #Javascript
You might like
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
yii框架无限极分类的实现方法
2017/04/08 PHP
js Date概念详细介绍
2013/11/22 Javascript
js正则表达式中test,exec,match方法的区别说明
2014/01/29 Javascript
jquery为页面增加快捷键示例
2014/01/31 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
JavaScript判断文件上传类型的方法
2014/09/02 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
vue.js获取数据库数据实例代码
2017/05/26 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
[16:56]heroes英雄教学 司夜刺客
2014/09/18 DOTA
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
Python科学计算环境推荐——Anaconda
2014/06/30 Python
python简单分割文件的方法
2015/07/30 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
浅析python协程相关概念
2018/01/20 Python
python做量化投资系列之比特币初始配置
2018/01/23 Python
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
Python+unittest+DDT实现数据驱动测试
2020/11/30 Python
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
深圳-东方伟业笔试部分
2015/02/11 面试题
护理自荐信范文
2013/10/05 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
部队反四风对照检查材料
2014/09/26 职场文书
PyQt5爬取12306车票信息程序的实现
2021/05/14 Python
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS