微信小程序网络请求封装 cookie 添加 cookie 自述 bug修复

今天在上线的小程序中遇到一个bug,关于cookie的问题 然后记录下来,弄懂了一下cookie是怎么运作的,

首先说这个bug是怎么来的;

分析:

我的小程序中封装了微信的请求,本身微信的请求是不支持cookie,需要经过处理才能在请求头里带上cookie;所以经过封装的request如下:

/* 自己封装的请求方法,用法同wx.request */
export function request(obj) {
  if (!obj.noLoading) wx.showLoading();
  /* 可以自传服务器地址也可以用默认服务器 */
  // var appInst =  getApp();
  // var headers=getApp().globalData.header.Cookie = 'JSESSIONID=' + store.state.token;
  // var header = getApp().globalData.header;
  var header = {
    'content-type': 'application/json; charset=utf-8',
    'cookie': wx.getStorageSync("sessionid")
  };
  let url = obj.url.indexOf('http') == -1 ? config.baseUrl + obj.url : obj.url;
  // let url = urlType === 'scan' ?  config.productUrl+ obj.url : config.baseUrl + obj.url ;
  wx.request({
    url: url,
    method: obj.method || "GET",
    // data: Object.assign(obj.data, {loginInfo: store.state.loginInfo}),
    data: obj.data,
    // header: obj.header || {
    //   'content-type': 'application/json', // 默认值
    //   'JSESSIONID': store.state.token
    // },
    header: header,
    success: (res) => {

      wx.hideLoading();
      if (res.statusCode !== 200) {
        wx.showToast({
          title: '服务器异常...',
          icon: 'none',
          duration: 2000,
          success: () => {
            console.log('服务器异常');
            setTimeout(() => {
              //要延时执行的代码
              wx.redirectTo({
                url: '/pages/login/main'
              });
            }, 500) //延迟时间 
          }
        })
      } else {
        obj.success(res);
        //微信授权token失效, 请重新登录
        var cookie = res.header["Set-Cookie"];
        if (cookie != null) {
          wx.setStorageSync("sessionid", res.header["Set-Cookie"]);
        }
        if (res.data.code == 403) {
          wx.removeStorage({key: "sessionid",success(res) {console.log(res);}});
          wx.showToast({
            title: res.data.errMsg,
            icon: 'none',
            duration: 2000,
            success: () => {
              setTimeout(() => {
                //要延时执行的代码
                wx.redirectTo({
                  url: '/pages/login/main'
                });
              }, 500) //延迟时间 
            }
          })
          // wx.redirectTo({
          //   url: '/pages/login/main'
          // });
        }
      }
    },
    fail: (res) => {
      wx.hideLoading();
      wx.showToast({
        icon: 'none',
        duration: 3000,
        title: '网络开小差,请稍后重试'
      });
      if (obj.fail) obj.fail(res);
    },
    complete: res => {
      if (obj.complete) obj.complete(res);

    }
  });
}

 

这段代码就是添加cookie用的

然后再说流程;

我这里下方的图片有四个接口;

流程是 先调用登陆接口;我这边在调用接口的时候会给后台传入一个cookie:

图片上可以看到 Request Headers中的cookie参数值是空的, 对,它就是空的,

因为这个Request Headers 是我们前端需要传给后台的参数,一开始调用登陆的时候是没有cookie这个值的,那么后台接收到请求之后,一看 cookie是空的,好,既然是空的,那我后台就给你一个cookie,那这个cookie 我们在哪儿看呢?那就在 Response Headers中,这个Response Headers是后台返回给我们的数据,你是不是发现其中有一个

Set-Cookie:JSESSIONID=BFE906BE407F3F740B6B308F2D2F0480; Path=/; HttpOnly

对了 这就是后台返给我们前端的参数,那我们这边拿到这个cookie 存下来,下次请求接口的时候需要带上这个cookie 传给后端,保持我们的这个登陆状态。那么这个逻辑就完了。

 

那接下来说bug:

看我图片中第一个接口 登陆接口 后台返回了一个 set-cookie 我们拿到这个cookie 去请求下面的第二个请求

 

 

其实我图上说的已经很清楚了,你看下第二个接口我发送给后端的接口中 cookie 和上面 登陆的时候后台返给我的一摸一样呢,是的 它就是一样的。没有问题。就是这个操作你调用接口 就是反复始终,除非这个cookie过期了 或者你重新登陆了 那么这个cookie就变了,但是不影响程序逻辑,

所以第三个接口也是一样的,所以我们就不看第三个接口了,

直接看第四个接口;

这个接口是腾讯地图调用的接口;

你看我同样是用了我封装好的网络请求方法;我传入了cookie 但是腾讯不认识你这个cookie,好,它就会下发一个新的cookie给你,为什么它不认识,因为它不是我们后台 是腾讯后台,所以肯定不认识我们的cookie,所以下发了一个新的 然而我拿到它这个新的cookie。

 

然后我拿到新的cookie 我就会通过我封装好的请求方式去保存这个cookie,接下来我又调用了第四个接口,这个是我们后端的接口,

 

你看 我传入后台的cookie 变成了腾讯返回给我的cookie 传过去之后 后端不认识这个 然后又给了一个新的给我,然后我拿到这个新的 去请求其他接口的时候 就提示失效了 要我重新登陆。,但是只要我不去调用腾讯的定位请求接口 这个cookie还是可以用的,但是只要一旦调用 腾讯的定位请求接口 这个cookie就会变化,就需要我重新登陆。所以 我的做法是

在调用腾讯的定位请求接口的时候 就直接使用微信原生的这个wx.request请求

这样就不会覆盖我们本来的cookie了。问题就直接解决/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2020.04.02 F 修复 32 位系统无法编译小程序、提示重启耗时过久的问题 反馈详情 F 修复 使用 cli 打开 project.config.json 中 projectname 为中文的项目时会一直卡在初始化应用通信能力的问题 反馈详情 F 修复 ts 项目编译前命令无限执行的问题 反馈详情 F 修复 PC 端模拟器的 touchend 事件回调参数 changedTouches 为空的问题 反馈详情 2020.03.25 更新说明 A 新增 云开发控制台支持开通按量付费 A 新增 云开发支持数据库备份与回档(还原)详情 A 新增 支持小程序自动化多帐号调试 A 新增 显示灰度中的基础库以及基础库支持的客户端版本 详情 A 新增 下发测试基础库 详情 A 新增 支持模拟 API 的返回内容 详情 A 新增 支持同时重命名多个同名的文件 A 新增 真机调试出现异常时,可手动操作重试 A 新增 增加工具加载 loading 展示 A 新增 模拟器支持终止 A 新增 支持小游戏代码补全 U 优化 模拟器工具栏及状态栏界面 U 优化 云开发控制台监控图表展示 U 优化 模拟器添加边框 反馈详情 U 优化 更新命令行和 HTTP v2 版本 详情 F 修复 修改 cloudFunctionRoot 会出现文件找不到的问题 反馈详情 F 修复 不能正确打开已被删除文件夹的项目的问题 F 修复 点击菜单工具栏管理无反应的问题 F 修复 工具外修改项目配置 cli 上传不生效的问题 F 修复 工具预览/上传提示文件已经存在的问题 反馈详情 F 修复 调试器放大会导致 inspect 按钮样式异常的问题 F 修复 模拟器工具栏样式异常 F 修复 wx.addPhoneContact时顶部按钮显示错误的问题 反馈详情 F 修复 标题栏文字过长覆盖胶囊按钮的问题 F 修复 文件系统读取代码包内文件规则与真机不一致的问题 F 修复 关闭多帐号调试窗口 tabbar 内的 icon 无法加载的问题 反馈详情 F 修复 预览上传错误提示无效的 json 文件 反馈详情 F 修复 使用非等宽字体时光标可能错位的问题 F 修复 某些项目可能出现 wxml not found 的问题 F 修复 真机调试 Appdata 和 WXML 面板可能显示空白的问题 F 修复 弹出模拟器时 getMenuButtonBoundingClient 调用结果为空的问题 A 新增 支持小程序自动化截图功能 A 新增 编辑器面包屑导航条支持自定义快捷导航 A 新增 模拟小程序进程销毁重启 A 新增 编辑器行内错误和警告提示 A 新增 Mac 和 Windows 微信的模拟器类型 U 优化 1.02.1912261 的安装包结构 U 优化 MacOS 版关闭项目窗口时,显示项目列表窗口 U 优化 插件开发模式下 miniprogramRoot 下 app.json 中插件 provider 与项目 appid 一致时,version 必须为 "dev" F 修复 1.02.1912261 引入的多帐号调试 tabBar 图标无法加载的问题 F 修复 1.02.1912261 引入的 jsserverRoot 目录右键菜单缺失部分选项的问题 F 修复 公众号网页调试中,Base64 图片无法通过调试器打开的问题 反馈详情 F 修复 cli 调用自动预览无法使用自定义编辑条件的问题 F 修复 Windows 版无法使用录音功能的问题 F 修复 插件开发模式下,插件页面配置不生效的问题 F 修复 小游戏开放数据域使用增强编译报错的问题 F 修复 Windows 版某些情况下无法显示项目窗口的问题 F 修复 切换 cloudfunctionsRoot 无法同步云函数的问题 反馈详情 F 修复 Wxml 面板丢失 text 标签子节点的问题 F 修复 上传时文件体积大小提示错误问题 反馈详情 F 修复 使用非等宽字体时光标可能错位的问题 F 修复 文件系统 api 读取代码包内文件规则与真机不一致的问题 A 新增 编辑器全局替换 A 新增 编辑器分栏 A 新增 编辑器文件多选操作和拖动到文件夹 A 新增 编辑器多选操作和拖动到文件夹 A 新增 编辑器代码大纲 A 新增 编辑器文件对比 A 新增 选取 android 设备上的 profile 文件进行分析 详情 A 新增 WXML 面板支持自定义组件数据查看与实时修改 A 新增 WXML 面板支持使用键盘 (上下左右) navigate the DOM tree A 新增 WXML 面板
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值