Token作为用户身份认证的重要凭证,在移动端应用开发中扮演着关键角色。Uni-app支持多端开发,因此如何安全、高效地完成token本地缓存、读取以及管理,是开发登录功能、接口请求拦截等业务时经常遇到的问题。
Uni-app提供了内置的本地存储API,可以方便地将token保存到设备缓存中,并在后续请求时获取使用。合理使用缓存机制,不仅能够提升用户体验,还可以避免用户每次打开应用都重新登录。
一、Uni-app本地缓存token的基本方式
Uni-app中的本地缓存主要通过uni.setStorage、uni.getStorage等API实现。这些方法基于浏览器Storage或原生端本地存储能力进行了统一封装,可以兼容微信小程序、H5、App等多个平台。
常见的token缓存流程如下:
-
用户登录成功;
-
后端返回token;
-
前端调用缓存API保存token;
-
后续接口请求时读取token;
-
将token放入请求头完成身份验证。
例如,登录接口返回的数据如下:
JavaScript{ code: 200, data: { token: "abcdef123456789" } }
获取token后,可以保存到本地缓存中。
二、使用uni.setStorage存储token
uni.setStorage是Uni-app推荐使用的异步缓存方法。
示例代码:
JavaScriptlogin() { uni.request({ url: 'https://example.com/login', method: 'POST', data: { username: 'admin', password: '123456' }, success: (res) => { if (res.data.code === 200) { const token = res.data.data.token; uni.setStorage({ key: 'token', data: token, success() { console.log('token保存成功'); } }); } } }); }
执行成功后,token会被保存到本地缓存中。之后用户重新打开应用,也可以继续读取该数据。
三、使用uni.getStorage获取token
保存token后,可以通过uni.getStorage获取缓存内容。
示例:
JavaScriptuni.getStorage({ key: 'token', success(res) { console.log('当前token:', res.data); }, fail() { console.log('token不存在'); } });
如果缓存中存在对应key,res.data就是之前保存的token。
这种方式适合页面初始化、请求接口前检查用户登录状态等场景。
四、同步方式存储和获取token
除了异步API,Uni-app还提供同步方法:
保存token
JavaScriptuni.setStorageSync('token', token);
获取token
JavaScriptconst token = uni.getStorageSync('token'); console.log(token);
同步方法代码更加简洁,适合简单场景使用。
例如:
JavaScriptconst token = res.data.token; uni.setStorageSync('token', token);
获取时:
JavaScriptlet token = uni.getStorageSync('token'); if (token) { console.log('用户已经登录'); }
不过需要注意,同步操作会阻塞当前线程。如果频繁执行大量缓存操作,可能影响页面响应速度。
五、封装token缓存工具类
在实际项目中,不建议在每个页面直接调用缓存API,而应该统一封装管理。
例如创建utils/auth.js:
JavaScriptconst TokenKey = 'token'; export function setToken(token) { return uni.setStorageSync(TokenKey, token); } export function getToken() { return uni.getStorageSync(TokenKey); } export function removeToken() { return uni.removeStorageSync(TokenKey); }
使用时:
JavaScriptimport { setToken, getToken, removeToken } from '@/utils/auth.js'; setToken('abcdef123456'); let token = getToken(); console.log(token); removeToken();
通过统一管理,可以减少重复代码,同时方便后期修改token存储方式。
六、请求接口自动携带token
通常情况下,token需要添加到请求头中,例如:
Authorization: Bearer token值
可以通过uni.request封装实现自动添加。
示例:
JavaScriptimport { getToken } from '@/utils/auth.js'; function request(options) { let token = getToken(); return uni.request({ url: 'https://example.com' + options.url, method: options.method || 'GET', data: options.data || {}, header: { Authorization: token } }); }
之后业务接口调用时:
JavaScriptrequest({ url:'/user/info', method:'GET' });
请求会自动携带用户身份信息。
这种方式能够避免每个接口重复编写token逻辑。
七、退出登录时清除token
用户主动退出账号时,需要删除本地缓存中的token。
示例:
JavaScriptuni.removeStorageSync('token'); uni.reLaunch({ url:'/pages/login/login' });
删除token后,用户再次进入应用时,需要重新完成登录流程。
八、token过期处理方案
实际项目中,token通常具有有效时间。如果token过期,服务器会返回类似401或403状态码。
可以在请求封装中统一处理:
JavaScriptif(res.statusCode === 401){ uni.removeStorageSync('token'); uni.navigateTo({ url:'/pages/login/login' }); }
这样可以避免用户继续使用失效身份访问接口。
更完善的方案是结合refresh token机制:
-
access token用于日常接口访问;
-
refresh token用于刷新新的access token;
-
access token过期后自动更新。
这种方式可以减少用户频繁登录,提高应用体验。
九、token存储安全注意事项
虽然Uni-app提供了方便的本地缓存方式,但token仍然属于敏感信息,需要注意安全问题。
1. 不要存储永久有效token
长期有效token如果泄露,会增加账号风险。
建议:
-
设置合理过期时间;
-
服务端支持token失效机制;
-
定期刷新token。
2. 不要在日志中输出token
开发阶段经常使用:
JavaScriptconsole.log(token);
正式上线前应该删除相关日志,避免token被调试工具获取。
3. 注意缓存清理
用户退出账号、切换账号时,应及时删除旧token。
否则可能出现账号信息混乱的问题。
4. 配合HTTPS使用
token传输过程中必须使用HTTPS加密通信,避免网络环境中被截取。
十、uni-app中token缓存常见问题
1. 获取不到token怎么办?
可以检查:
-
key名称是否一致;
-
是否在保存完成后立即读取;
-
是否调用了清除缓存方法;
-
不同运行环境缓存是否独立。
例如:
保存:
JavaScriptuni.setStorageSync('token','123456');
读取:
JavaScriptuni.getStorageSync('Token');
由于大小写不同,会导致获取失败。
2. APP卸载后token是否存在?
通常情况下,应用卸载后本地缓存会被系统清除。
重新安装应用后,需要重新登录。
3. 多端运行缓存是否共享?
不同平台的缓存环境相互独立。
例如:
-
H5浏览器缓存;
-
微信小程序缓存;
-
App本地缓存;
它们不会自动同步。
十一、推荐的项目实践方式
在中大型Uni-app项目中,建议采用以下结构:
├── utils │ └── auth.js ├── api │ └── request.js ├── store │ └── user.js └── pages └── login
其中:
-
auth.js负责token存取; -
request.js负责自动携带token; -
user.js负责用户状态管理; -
登录页面负责获取并保存token。
这种分层方式能够提高代码维护性,也方便后续扩展权限控制、自动刷新token等功能。
总结
Uni-app中本地缓存token主要依靠uni.setStorage、uni.getStorage以及对应的同步方法实现。简单项目可以直接使用缓存API完成token保存和读取,而实际开发中更推荐进行统一封装,并结合请求拦截、过期处理以及安全策略构建完整认证流程。
合理管理token,不仅能够提升用户登录体验,还能增强应用接口访问的安全性,是Uni-app开发中不可缺少的重要实践。