源碼以下:typescript
import { Injectable } from '@angular/core'; import { AES, enc } from 'crypto-js'; import { has, isNull, isUndefined, isNaN, each } from 'lodash'; @Injectable() export class SessionService { private json: Object = {}; private tobeLocalSavedJson: Object = {}; private tobeSessionSavedJson: Object = {}; private timeoutId: any; /** * 獲得session的值 * @param {string} key * @returns {any} */ public get(key: string): any { console.debug('begin get(),key is %s', key); if (has(this.json, key)) { try { let valueStr = sessionStorage.getItem(key) || localStorage.getItem(key); if (valueStr) { this.json[key] = JSON.parse(AES.decrypt(valueStr, key) .toString(enc.Utf8)); } } catch (e) { console.error(`localStorage access denied!`); return null; } return this.json[key]; } } /** * 添加session * * @param {string} key * @param value * @param {boolean} isPersistence */ public put(key: string, value: any, isPersistence?: boolean): void { isPersistence = isPersistence || false; if (isNull(value) || isUndefined(value) || isNaN(value)) { this.remove(key); return; } this.json[key] = value; if (isPersistence) { this.tobeLocalSavedJson[key] = value; } else { this.tobeSessionSavedJson[key] = value; } try { this._delaySave(); } catch (e) { console.error(`localStorage access denied!`); } } /** * 清除全部session * @param {boolean} isAlsoClearPersistent */ public clear(isAlsoClearPersistent?: boolean) { this.json = {}; try { sessionStorage.clear(); } catch (e) { console.error(`localStorage access denied!`); } if (isAlsoClearPersistent) { try { localStorage.clear(); } catch (e) { console.error(`localStorage access denied!`); } } this.tobeLocalSavedJson = {}; this.tobeSessionSavedJson = {}; } /** * 移除對應key的session * @param {string} key */ public remove(key: string) { delete this.json[key]; delete this.tobeSessionSavedJson[key]; delete this.tobeLocalSavedJson[key]; try { sessionStorage.removeItem(key); localStorage.removeItem(key); } catch (e) { console.error(`localStorage access denied!`); } } private _delaySave(): void { clearTimeout(this.timeoutId); this.timeoutId = setTimeout(() => { try { this.saveToStorge(this.tobeLocalSavedJson, localStorage); this.saveToStorge(this.tobeSessionSavedJson, sessionStorage); this.tobeLocalSavedJson = {}; this.tobeSessionSavedJson = {}; } catch (e) { console.error(`localStorage access denied!`); } }, 100); } private saveToStorge(json, storge) { each(json, (value: any, key: any) => { let encryptValue = AES.encrypt(JSON.stringify(value), key); try { storge.setItem(key, encryptValue); } catch (e) { console.error(`localStorage access denied!`); } }); } }