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

所属分类: 网络编程 / JavaScript 阅读数: 1606
收藏 0 赞 0 分享

因为小程序原生不支持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问题的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

更多精彩内容其他人还在看

jQuery LigerUI 使用教程表格篇(1)

ligerGrid是ligerui系列插件的核心控件,用户可以快速地创建一个美观,而且功能强大的表格,支持排序、分页、多表头、固定列等等
收藏 0 赞 0 分享

JavaScript中常用的运算符小结

JavaScript中常用的运算符小结,需要的朋友可以参考下。
收藏 0 赞 0 分享

深入理解JavaScript系列(13) This? Yes,this!

在这篇文章里,我们将讨论跟执行上下文直接相关的更多细节。讨论的主题就是this关键字。实践证明,这个主题很难,在不同执行上下文中this的确定经常会发生问题
收藏 0 赞 0 分享

javascript (用setTimeout而非setInterval)

javascript (用setTimeout而非setInterval)如果用setInterval 可能出现 下次调用会在前一次调用前调用
收藏 0 赞 0 分享

JavaScript中两个感叹号的作用说明

用两个感叹号的作用就在于,如果明确设置了o中flag的值(非null/undefined/0""/等值),自然test就会取跟o.flag一样的值;如果没有设置,test就会默认为false,而不是null或undefined
收藏 0 赞 0 分享

javascript写的简单的计算器,内容很多,方法实用,推荐

最近用javascript写了一个简单的计算器,自己测试感觉还好,代码都给了注释,非常不错,推荐大家学习。
收藏 0 赞 0 分享

js的表单操作 简单计算器

javascript写的简单的加减乘除计算器,里面涉及到一些方法还是很实用的哦,新手不要错过
收藏 0 赞 0 分享

Jquery中删除元素的实现代码

empty用来删除指定元素的子元素,remove用来删除元素,或者设定细化条件执行删除
收藏 0 赞 0 分享

javaScript 利用闭包模拟对象的私有属性

JavaScript缺少块级作用域,没有private修饰符,但它具有函数作用域。作用域的好处是内部函数可以访问它们的外部函数的参数和变量(除了this和argument
收藏 0 赞 0 分享

为JavaScript类型增加方法的实现代码(增加功能)

大家在js开发过程中有些功能已经满足不了我们的需求,或没有我们需要的功能,那么我们就可以自己扩展下,个性化js
收藏 0 赞 0 分享
查看更多