You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何存储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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 12:06:44