如何存储UALJS类实例至本地存储?实现页面刷新后可访问
处理UALJS实例跨页面刷新的方案
首先明确:UALJS实例包含非序列化的对象(比如回调、浏览器API引用),无法直接存入localStorage。正确的做法是存储可序列化的会话状态,页面刷新后用该状态重新初始化实例并恢复会话。
1. 提取并存储会话状态
在用户授权成功后,从UAL实例中提取可序列化的核心状态存入本地存储:
// 已初始化的UAL实例 const ual = new UALJS([anchorProvider], renderer); // 监听登录成功事件,提取状态存储 ual.onLogin((user) => { const sessionState = { accountName: user.accountName, permission: user.permission, chainId: user.chainId // 只存可序列化字段,避免函数、DOM引用这类无法存储的内容 }; localStorage.setItem('ual_session', JSON.stringify(sessionState)); });
2. 页面刷新后恢复会话
页面加载时,读取存储的状态,重新初始化UAL并尝试恢复登录状态:
// 初始化渲染器和Provider const renderer = new UALPlainJsRenderer(); const anchorProvider = new Anchor([{ chainId: '你的目标链ID', rpcEndpoints: [{ url: '你的RPC节点地址' }] }]); // 读取本地存储的会话状态 const savedSession = localStorage.getItem('ual_session'); const ual = new UALJS([anchorProvider], renderer); if (savedSession) { const sessionState = JSON.parse(savedSession); // 调用Anchor的restoreSession方法恢复会话 anchorProvider.restoreSession(sessionState.chainId) .then((user) => { if (user) { // 恢复成功,更新UAL的活跃用户状态 ual.setActiveUser(user); // 执行你的业务逻辑 } }) .catch((err) => { // 恢复失败,清除无效存储 localStorage.removeItem('ual_session'); console.error('会话恢复失败:', err); }); }
3. 关键注意事项
- 禁止直接存储UAL实例:
localStorage.setItem('ual', ual)必然失败,因为实例包含大量无法序列化的函数和引用。 - 敏感信息谨慎存储:如果会话状态包含敏感数据,建议改用
sessionStorage(页面关闭即自动清除)或加密存储方案。 - 登出时清理状态:监听登出事件,及时清除本地存储的会话数据:
ual.onLogout(() => { localStorage.removeItem('ual_session'); });
内容的提问来源于stack exchange,提问作者dsanich
相关产品推荐
相关产品推荐

