原文链接
00 思路
我们知道session需要通过服务器HTTP响应Header中的Set-Cookie实现:浏览器接收到此值后将会在本地生成cookie,并在之后的同域请求Header中附上此Cookie,服务器session服务再通过Cookie值来获取对应的信息以完成状态校验。
小程序不支持cookie,但wx.request可以设置请求header及获取响应的header设置,因此我们可以通过获取响应header中的Set-Cookie值并将其保存,并在下次请求时添加到heaer中来模拟浏览器的session cookie行为,以使得基于session的状态维护变得可能。
01 实现示例
wx.request({
url : 'xx.com/api',
success : res => {
//保存每次请求的Set-Cookie
mockSessionCookies(res);
return res;
},
header : {
//每次请求都在header带上
Cookie : searilizeJson( wx.getStorageSync('mockSessionCookies') )
},
});
function mockSessionCookies( res ){
if( !res.header['Set-Cookie'] ) return;
let cookies = this.storage('mockSessionCookies');
if( !cookies ) cookies = {};
//解析Set-Cookie. wx.request会将多个Set-Cookie以','连接
res.header['Set-Cookie'].split('HttpOnly,').forEach( ck => {
let kv = ck.split(';')[0].split('=');
cookies[ kv[0] ] = kv[1];
})
wx.setStorageSync( 'mockSessionCookies', cookies );
}
function serializeJson( obj ){
let str = '';
for( let k in obj ){
str += k + '=' + obj[k] + ';';
}
return str;
}
转者注:有些Set-Cookie是无效的,只有Key没有Value,因此在存储时应去除,下面是本人改写的代码:
var cookies = "";
respCookie.split('HttpOnly,').forEach(ck => {
let kv = ck.split(';')[0].split('=');
if (kv[1]) {
cookies += kv[0] + "=" + kv[1] + ";";
}
})
wx.setStorageSync(pyutils.sessionKey, cookies);
存储时直接以字符串存储,使用时取出来直接用就行了。
评论
发表评论