由于小程序没有域名等因素,并不能跟浏览器访问一个网站一样,自动设置cookie和提交cookie,但可自行实现类似cookie行为,达到跟浏览器一样的效果,注意仅限于wx:request请求的封装处理,如果其他非通过wx:request发出来的请求,还是无法自动携带cookie,这是跟浏览器默认行为不同的地方。
实现方式:
var cookie = "";
var baseUrl = "http://127.0.0.1:7001";
async function login(useTip) {
if (useTip) {
await wx.showModal({
title: '提示',
content: '点击确定,重新登录',
showCancel: false
})
}
let data = await wx.login()
await request({
url: "/login",
data: {
js_code: data.code
}
})
if (useTip) {
wx.showToast({
title: '登录成功',
icon: 'success',
duration: 2000
})
}
return;
}
function request(params) {
return new Promise((resolve, reject) => {
if (params.waitMsg) {
wx.showLoading({
mask: true,
title: params.waitMsg,
})
}
wx.request({
url: baseUrl + params.url,
data: params.data,
timeout: params.timeout || 6000,
header: {
'content-type': 'application/json',
'cookie': cookie //读取cookie
},
method: "POST",
success: async (res) => {
let c = res.header["set-cookie"];
if (c) {
cookie = c
}
if (res.data.code === 401) {
login(true);
}
resolve(res.data)
},
fail: reject,
complete() {
if (params.waitMsg) {
wx.hideLoading()
}
}
})
})
}
在请求结果里面获取请求头里面的cookie相关信息,并且保留下,上述的代码还会有bug,只是简单粗暴的把set-cookie内容覆盖保存下来,实际使用需要对cookie做更精细化处理,对比本地已存在的cookie进行必要增删改查