最近在开发一个小程序遇到一个问题,后端接口的登录验证通过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)