微信小程序实现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 相关文章推荐
javascript入门·对象属性方法大总结
Oct 01 Javascript
JavaScript 学习笔记(十三)Dom创建表格
Jan 21 Javascript
JQuery AJAX提交中文乱码的解决方案
Jul 02 Javascript
Jquery实现弹性滑块滑动选择数值插件
Aug 08 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
Oct 15 Javascript
js 获取本地文件及目录的方法(推荐)
Nov 10 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
Dec 18 Javascript
vue双向绑定的简单实现
Dec 22 Javascript
BOM之navigator对象和用户代理检测
Feb 10 Javascript
JS库之Particles.js中文开发手册及参数详解
Sep 13 Javascript
微信小程序form表单组件示例代码
Jul 15 Javascript
利用jqgrid实现上移下移单元格功能
Nov 07 Javascript
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
PHP版自动生成文章摘要
2008/07/23 PHP
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
mysql总结之explain
2012/02/27 PHP
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
php反射应用示例
2014/02/25 PHP
PHP异常处理浅析
2015/05/12 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
PHP简单日历实现方法
2016/07/20 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
js实现无限级树形导航列表效果代码
2015/09/23 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
BootStrap Typeahead自动补全插件实例代码
2016/08/10 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
2018/08/04 Javascript
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
Python中编写ORM框架的入门指引
2015/04/29 Python
Python argv用法详解
2016/01/08 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
在Python中增加和插入元素的示例
2018/11/01 Python
Django为窗体加上防机器人的验证码功能过程解析
2019/08/14 Python
python程序输出无内容的解决方式
2020/04/09 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
财务经理岗位职责
2013/11/09 职场文书
行政办公室岗位职责
2014/03/18 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书