1. 起因
在小程序开发中,我们经常需要向后台请求数据并进行操作。在请求过程中,我们需要通过session进行用户的身份验证。然而,有时我们会遇到session失效的情况,请求无法正常进行。
那么,这个问题怎么解决呢?接下来,我们将一一进行探讨。
2. 原因分析
首先,我们要了解为什么会出现session失效的情况。在小程序中,我们通过wx.request发起异步请求,而这个请求使用的是微信客户端所持有的cookie。当我们退出小程序后,微信客户端会清空cookie,此时我们再次进入小程序时,就会遇到session失效的情况。
因此,如果我们希望在小程序中保持用户的持久登录状态,我们需要想办法让后台服务器自行实现session的持久化。
3. 解决方案
3.1 在服务端设置session过期时间
在服务端设置session过期时间是一个解决方案。为了让session保持长久有效,我们可以在后台的登录接口中加入类似下面的代码:
//设置session过期时间为1天
app.use(session({
secret: 'keyboard cat',
cookie: { maxAge: 24 * 60 * 60 * 1000 },
resave: false,
saveUninitialized: true
}))
这样,session就会在一天内有效。在此期间,即使用户退出小程序,再次进入时也不会遇到session失效的问题。
3.2 在服务端使用token
另一个解决方案是在后台使用token。token是一种轻便且安全的解决身份验证的方式,它可以在网站和客户端之间传递有关用户身份的数据。token会在客户端存储,每次请求时都会携带token。如果token过期了,客户端会自动向后台发送请求来获取新的token。
为了使用token,我们需要在后台进行一定的配置。通常,我们会使用jsonwebtoken这个第三方库来进行token的生成、验证、过期处理等操作。例如:
//生成token
const token = jwt.sign({ username }, SECRET, { expiresIn: '24h' })
//验证token
jwt.verify(token, SECRET, function(err, decoded) {
console.log(decoded.username)
})
在小程序中,我们需要在wx.request请求中添加header参数,携带token信息。例如:
//获取token
const token = wx.getStorageSync('token')
//请求接口
wx.request({
url: 'https://xxx.com/api',
header: {
'content-type': 'application/json',
'authorization': 'Bearer ' + token
},
data: {},
success: function (res) {
//请求成功
},
fail: function (res) {
//请求失败
}
})
通过这种方式,我们就可以避免session失效的问题。
3.3 在小程序中手动清除storage
如果我们不能在后台进行修改,也没有使用token的需求,我们还有另一种解决方案。我们可以在小程序中手动清除storage,这样就可以清空客户端的cookie,避免session失效的问题。
在小程序中通过wx.clearStorageSync()可以清空storage,例如:
//清空storage
wx.clearStorageSync()
当我们需要退出登录时,调用一次wx.clearStorageSync()即可。
4. 总结
在小程序中,session失效是一个常见的问题。我们可以通过在服务端设置session过期时间、使用token或在小程序中手动清除storage来解决这个问题。具体选用哪种方案,根据自己的需求和后台环境来决定。