微信小程序后端无法保持session的原因及解决办法问题

微信小程序后端无法保持session的原因及解决办法问题

admin
2021-01-06 / 0 评论 / 290 阅读 / 正在检测是否收录...

最近在开发一个小程序遇到一个问题,后端接口的登录验证通过postman调试是可以成功的,后端采用了session机制验证token信息,因为postman可以调试通过,那么可以排除是后端没开启session的问题,

最后发现,原来浏览器会自动维护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。

我采用了在请求头中的Cookie字段带上sessionid的方式

自己维护一个header,在wx.request中保存和发送Cookie。
首先在app.js中存储一个全局变量,存放header。

globalData: {
  header: {
   "content-type": "application/x-www-form-urlencoded",
   'Cookie': ''
  }
 }

然后在每一次wx.request中的请求参数中带上该header。
在每一次响应中检测并保存Cookie到header。

wx.login({
      success: (res) => {
        getToken({
          data: { code: res.code, Cookie: getApp().globalData.cookie },
          success: (res) => {
            console.log(res);
            // 注:此处的resHeader是在请求方法中封装好返回的返回体中的ResponseHeader
            if (res.resHeader["Set-Cookie"] != null) {
              //设置cookie
              This.globalData.Cookie += res.resHeader["Set-Cookie"]
             }
            const token = res.data.token;
            console.log('getToken success', res);
            This.globalData.token = token;
            wx.setStorage({ key: 'token', data: token})
          },
        })
      }
    })

其他请求的请求头中带上Cookie信息

 header: {
          token: res.data,
          Cookie: getApp().globalData.Cookie
        },

测试

第一次请求接口-登录接口

RequestHeader:
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
content-type: application/json
Cookie: 
Host: marvengong.natapp1.cc
Referer: https://servicewechat.com/wx66bf3980d8d1660f/devtools/page-frame.html
token: D3F3CD0A-FB1C-6B30-8C5B-41A8AAA2A799
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 wechatdevtools/1.03.2011120 MicroMessenger/7.0.4 Language/zh_CN webview/

第一次请求的响应ResponseHeader

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
Date: Wed, 06 Jan 2021 14:22:52 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive: timeout=5, max=100
Pragma: no-cache
Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02
Set-Cookie: PHPSESSID=t3fk6bpkrj2njiejsp0qva9fv1; path=/
Transfer-Encoding: chunked
X-Powered-By: PHP/5.6.9

第二次请求--提交用户信息接口
RequestHeader

Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Content-Length: 842
content-type: application/json
Cookie: PHPSESSID=t3fk6bpkrj2njiejsp0qva9fv1; path=/
Host: marvengong.natapp1.cc
Origin: http://127.0.0.1:23460
Referer: https://servicewechat.com/wx66bf3980d8d1660f/devtools/page-frame.html
token: 88845DB7-DDA4-D515-1BC0-EE812B5142D9
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 wechatdevtools/1.03.2011120 MicroMessenger/7.0.4 Language/zh_CN webview/

可以看到第二次请求带上了Cookie信息,其中的重要信息就是PHPSESSID,这是客户端和服务端会话的票据

以上方法基本能解决微信小程序Cookie问题。

0

评论 (0)

取消