微信小程序登录状态代码中,如何自动调用函数实现登录状态保持?
- 内容介绍
- 文章标签
- 相关推荐
微信小程序在业务场景中几乎少不了,但开发者与使用者都面临一个共同痛点:登录状态无法保持导致使用者频繁被弹出登录框、数据刷新失效、后台会话丢失等问题。
从痛点一来看,频繁触发登录流程。影响使用者体验
很多小程序在页面跳转时都会
调用 wx.login 或检查本地缓存,若未检测到有效凭证就弹出“请先登录”提示。这样既打断了使用者的操作,也降低了留存率。
说到痛点二,前后端会话不一致。导致请求被认为是未登录
小程序通过 wx.request 向服务器发起请求时每一次请求都被视为新的会话。若没有正确携带 session 或 token。服务器会返回“未授权”错误,使得业务逻辑无法执行。
再看痛点三,状态管理混乱。代码维护成本高
有些项目直接在每个页面的 onLoad 里写判断逻辑,而另一些项目又使用全局变量或 Vuex 来同步状态。这种多源管理方式导致代码分散、重复且难以统一升级。
从方法一来看。利用本地存储实现自动恢复登录状态
主要思路:将成功获取到的 token 或自定义标识保存在本地缓存中,在每次页面加载时读取并判断。
// app.js
App({
globalData: {
isLoggedIn: false。token: ''
},onLaunch {
// 初始化时读取缓存
const token = wx.getStorageSync;if {
this.globalData.isLoggedIn = true;this.globalData.token = token;}
}
}),// 登录页
Page({
onLoad {
if .globalData.isLoggedIn) {
this.doLogin;}
},doLogin {
wx.login({
success: res => {
// 调用后台换取 session_key 与自定义 token
wx.request({
从url来看。'https://api.example.com/auth',data: { code: res.code },success: r => {
const { token } = r.data;// 缓存 token
wx.setStorageSync;this.getApp.globalData.isLoggedIn = true;this.getApp.globalData.token = token;}
}),}
});}
}),不过,
从关键要点来看。
- 一次性获取并缓存凭证:减少网络请求次数。
-
全局变量同步: 将缓存值写入
@app.globalData方便后续页面直接读取。 -
TOKEN 自动携带: 所有后续请求可在 request 的 header 中统一添加,如
'Authorization': 'Bearer ' + app.globalData.token.
方法二这方面。前后端协同 Session & Cookie 管理
挑战: 微信小程序自身不支持 cookie 自动同步,需要手动维护。
// 后台示例
app.post => {
const { code } = req.body;const sessionInfo = await getSessionFromWeChat;// 调用微信 API
const userId = await db.findOrCreateUser;// 创建 session 并返回 cookie
req.session.userId = userId;res.cookie,res.json;}),怎么说呢,// 小程序侧
wx.request({
至于url,'https://api.example.com/some-protected',method:'GET'。header:{
'content-type':'application/json'
// cookie 会自动随 request 附带,只需保证同域即可
},});
- 服务器端设置 HttpOnly Cookie: 防止 XSS 攻击。
-
wx.request 默认不传递 Cookie: 可通过
wx.setStorageSync手动在 header 中加入。 - safely check session validity 每次请求前确认 session 是否过期:
方法三这方面。使用 Uni-APP + Vuex 实现跨页面持久化状态管理
// store/index.js
export default new Vuex.Store({
state:{
isLoggedIn:false,token:''
},mutations:{
setLogin{
state.isLoggedIn=true;state.token=payload.token;uni.setStorageSync;},logout{
state.isLoggedIn=false;state.token='';uni.removeStorageSync;}
},actions:{
login{
return new Promise=>{
uni.login{
uni.request({
至于url。'https://api.example.com/auth',data:{ code:res.code},success{
commit;老实说,resolve,怎么说呢,},fail{reject;}
})
}})
})
}
});
- "onLaunch" 自动恢复: @/utils/auth.js: uni.onLaunch=>{const t=uni.getStorageSync;if{store.commit}})
再看优点。
- Treat all pages uniformly:- 每个页面只需 dispatch login 检查,无需重复写 onLoad 判断逻辑。
- User experience smooth:- 一旦凭证存在即无弹窗;若失效则统一跳转至 login 页面。
常用方法建议汇总
- **缓存有效期控制**:设置过期时间,避免长期无效 Token 泄漏。
- **Token 加密存储**:可使用 AES 对 Token 做加密后再存入 localStorage,以提高安全性。
- **统一错误处理**:所有接口均捕获「未授权」错误,并触发统一重登流程。
- **监控与日志**:记录每次 login 成功与失败的次数,用于排查异常情况。
只要把上述方案按项目需求组合起来即可彻底消除「频繁被迫重新登录」这一痛点。让使用者体验从此畅通无阻,也让开发者摆脱维护冗余判断逻辑的困扰。
微信小程序在业务场景中几乎少不了,但开发者与使用者都面临一个共同痛点:登录状态无法保持导致使用者频繁被弹出登录框、数据刷新失效、后台会话丢失等问题。
从痛点一来看,频繁触发登录流程。影响使用者体验
很多小程序在页面跳转时都会
调用 wx.login 或检查本地缓存,若未检测到有效凭证就弹出“请先登录”提示。这样既打断了使用者的操作,也降低了留存率。
说到痛点二,前后端会话不一致。导致请求被认为是未登录
小程序通过 wx.request 向服务器发起请求时每一次请求都被视为新的会话。若没有正确携带 session 或 token。服务器会返回“未授权”错误,使得业务逻辑无法执行。
再看痛点三,状态管理混乱。代码维护成本高
有些项目直接在每个页面的 onLoad 里写判断逻辑,而另一些项目又使用全局变量或 Vuex 来同步状态。这种多源管理方式导致代码分散、重复且难以统一升级。
从方法一来看。利用本地存储实现自动恢复登录状态
主要思路:将成功获取到的 token 或自定义标识保存在本地缓存中,在每次页面加载时读取并判断。
// app.js
App({
globalData: {
isLoggedIn: false。token: ''
},onLaunch {
// 初始化时读取缓存
const token = wx.getStorageSync;if {
this.globalData.isLoggedIn = true;this.globalData.token = token;}
}
}),// 登录页
Page({
onLoad {
if .globalData.isLoggedIn) {
this.doLogin;}
},doLogin {
wx.login({
success: res => {
// 调用后台换取 session_key 与自定义 token
wx.request({
从url来看。'https://api.example.com/auth',data: { code: res.code },success: r => {
const { token } = r.data;// 缓存 token
wx.setStorageSync;this.getApp.globalData.isLoggedIn = true;this.getApp.globalData.token = token;}
}),}
});}
}),不过,
从关键要点来看。
- 一次性获取并缓存凭证:减少网络请求次数。
-
全局变量同步: 将缓存值写入
@app.globalData方便后续页面直接读取。 -
TOKEN 自动携带: 所有后续请求可在 request 的 header 中统一添加,如
'Authorization': 'Bearer ' + app.globalData.token.
方法二这方面。前后端协同 Session & Cookie 管理
挑战: 微信小程序自身不支持 cookie 自动同步,需要手动维护。
// 后台示例
app.post => {
const { code } = req.body;const sessionInfo = await getSessionFromWeChat;// 调用微信 API
const userId = await db.findOrCreateUser;// 创建 session 并返回 cookie
req.session.userId = userId;res.cookie,res.json;}),怎么说呢,// 小程序侧
wx.request({
至于url,'https://api.example.com/some-protected',method:'GET'。header:{
'content-type':'application/json'
// cookie 会自动随 request 附带,只需保证同域即可
},});
- 服务器端设置 HttpOnly Cookie: 防止 XSS 攻击。
-
wx.request 默认不传递 Cookie: 可通过
wx.setStorageSync手动在 header 中加入。 - safely check session validity 每次请求前确认 session 是否过期:
方法三这方面。使用 Uni-APP + Vuex 实现跨页面持久化状态管理
// store/index.js
export default new Vuex.Store({
state:{
isLoggedIn:false,token:''
},mutations:{
setLogin{
state.isLoggedIn=true;state.token=payload.token;uni.setStorageSync;},logout{
state.isLoggedIn=false;state.token='';uni.removeStorageSync;}
},actions:{
login{
return new Promise=>{
uni.login{
uni.request({
至于url。'https://api.example.com/auth',data:{ code:res.code},success{
commit;老实说,resolve,怎么说呢,},fail{reject;}
})
}})
})
}
});
- "onLaunch" 自动恢复: @/utils/auth.js: uni.onLaunch=>{const t=uni.getStorageSync;if{store.commit}})
再看优点。
- Treat all pages uniformly:- 每个页面只需 dispatch login 检查,无需重复写 onLoad 判断逻辑。
- User experience smooth:- 一旦凭证存在即无弹窗;若失效则统一跳转至 login 页面。
常用方法建议汇总
- **缓存有效期控制**:设置过期时间,避免长期无效 Token 泄漏。
- **Token 加密存储**:可使用 AES 对 Token 做加密后再存入 localStorage,以提高安全性。
- **统一错误处理**:所有接口均捕获「未授权」错误,并触发统一重登流程。
- **监控与日志**:记录每次 login 成功与失败的次数,用于排查异常情况。
只要把上述方案按项目需求组合起来即可彻底消除「频繁被迫重新登录」这一痛点。让使用者体验从此畅通无阻,也让开发者摆脱维护冗余判断逻辑的困扰。

