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

Angular 4中能否重写sessionStorage方法实现自动加密解密?

当然可以!重写sessionStorage的方法就是最佳方案

完全不用修改你现有的业务代码,通过重写原生的setItem和getItem,就能让所有存储/读取操作自动带上加密解密逻辑。下面是具体实现思路和代码示例:

核心实现步骤

1. 先保存原生方法的引用

重写前一定要先把原始的setItem和getItem存起来,不然重写后就没法调用真正的存储逻辑了。

2. 重写setItem自动加密

在自定义的setItem里,先对传入的值加密,再调用原生方法存储加密后的内容。

3. 重写getItem自动解密

读取时先通过原生方法拿到加密值,解密后再返回给调用者。

4. 加上容错处理

比如解密失败时返回null或给出错误提示,避免影响业务代码。

完整代码示例

假设你已经有了成熟的encrypt和decrypt函数,这里用Base64做示例(实际替换成你的加密算法即可):

// 你的加密解密实现(替换成你自己的逻辑,比如AES)
function encrypt(data) {
  // 如果存储的是对象,先转成字符串
  const processedData = typeof data === 'object' ? JSON.stringify(data) : data;
  return btoa(processedData);
}

function decrypt(encryptedData) {
  if (!encryptedData) return null;
  try {
    const decryptedStr = atob(encryptedData);
    // 尝试解析为对象,失败则返回原始字符串
    try {
      return JSON.parse(decryptedStr);
    } catch {
      return decryptedStr;
    }
  } catch (e) {
    console.error('解密失败:', e);
    return null;
  }
}

// 保存原生方法引用
const originalSetItem = sessionStorage.setItem;
const originalGetItem = sessionStorage.getItem;

// 重写setItem
sessionStorage.setItem = function(key, value) {
  const encryptedValue = encrypt(value);
  // 用call绑定this,确保上下文正确
  originalSetItem.call(this, key, encryptedValue);
};

// 重写getItem
sessionStorage.getItem = function(key) {
  const encryptedValue = originalGetItem.call(this, key);
  return decrypt(encryptedValue);
};

效果验证

现在你原来的代码完全不用改:

// 自动加密后存储
sessionStorage.setItem('token', 'my token');
sessionStorage.setItem('userInfo', { id: 123, name: 'Alice' });

// 自动解密后获取
const token = sessionStorage.getItem('token'); // 输出 'my token'
const userInfo = sessionStorage.getItem('userInfo'); // 输出 { id: 123, name: 'Alice' }

备选方案(不推荐,仅作补充)

如果你不想修改原生sessionStorage,也可以封装一个自定义的存储类,但这样需要把所有现有代码里的sessionStorage替换成这个类,不符合你“不想改已有代码”的需求:

class EncryptedSessionStorage {
  static setItem(key, value) {
    const encryptedValue = encrypt(value);
    sessionStorage.setItem(key, encryptedValue);
  }

  static getItem(key) {
    const encryptedValue = sessionStorage.getItem(key);
    return decrypt(encryptedValue);
  }

  // 其他方法如removeItem、clear可以按需封装
}

内容的提问来源于stack exchange,提问作者Hamid Hosseini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:54:56