// 判断浏览器是否支持Local Storage function isLocalStorageSupported() { return typeof(Storage) !== "undefined"; } // 设置Cookie function setCookie(name, value, times) { let date = new Date(); date.setTime(date.getTime() + times); let expires = "expires=" + date.toUTCString(); document.cookie = name + "=" + value + ";" + expires + ";path=/"; } // 获取Cookie function getCookie(name) { let nameEQ = name + "="; let ca = document.cookie.split(';'); for(let i = 0; i < ca.length; i++) { let c = ca[i].trim(); if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length, c.length); } } return null; } // 删除Cookie function deleteCookie(name) { document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; } // 定义一个函数,获取本地存储的数据,并判断过期时间 function getStorage(key) { if (isLocalStorageSupported()) { const val = localStorage.getItem(key); if (!val) { return { value: sessionStorage.getItem(key), expire: 0 }; } const data = JSON.parse(val); if (data.expire && data.expire + data.time < Date.now()) { localStorage.removeItem(key); return null; } return data; } else { // 如果不支持localStorage,使用cookie const val = getCookie(key); if (!val) { return { value: getCookie(key), expire: 0 }; } else { const data = JSON.parse(val); if (data.expire && data.expire + data.time < Date.now()) { deleteCookie(key); return null; } return data; } } } // 定义一个函数,设置本地存储的数据,并设置过期时间 function setStorage(key, value, expire, time) { const now = new Date().getTime(); const data = { value, time: time ? time : now, expire }; if (isLocalStorageSupported()) { if (expire === 0) { window.sessionStorage.setItem(key, value); // setSessionCookie(key, value); } else { if (expire < 0 || (time && (time + expire) < now)) { window.localStorage.removeItem(key); } else { window.localStorage.setItem(key, JSON.stringify(data)); } } } else { // 如果不支持localStorage,使用cookie进行存储 if (expire < 0) { deleteCookie(key); return; } else { setCookie(key, JSON.stringify(data), expire); } } } // 设置会话级别的Cookie function setSessionCookie(name, value) { document.cookie = name + "=" + value + "; path=/; domain=www.dhresource.com; SameSite=None; Secure"; } // 定义 Hub 类 class Hub { constructor() { this._initListener(); this.map = { setItem: (key, value, expire, time) => this.setItem(key, value, expire, time), getItem: (key) => this.getItem(key) }; this._syncSessionStorageWithCookies(); } // 重写 setItem ,实现过期处理,增加 expire 参数,expire默认是一年,滑动过期时间 setItem(key, value, expire, time) { if (expire === void 0) { expire = 31536000000; } setStorage(key, value, expire, time); } // 重写 getItem ,实现过期处理,如果过期进行删除,返回 null;如果未过期,返回 value,并重新设置过期时间 getItem(key) { return getStorage(key); } // 监听 client iframeWin.postMessage() 事件 _initListener() { window.addEventListener('message', (e) => { if (!e || !e.data) return; const { method, key, value, id, expire, time } = e.data; if (!this.map[method]) return; const result = this.map[method](key, value, expire, time); let response; if (!result) { response = { id, key, result: null }; } else { response = { id, key, expire: result.expire, result: result.value, time: result.time }; } window.parent.postMessage(response, '*'); }); } // 同步 sessionStorage 与 会话级别的 Cookie _syncSessionStorageWithCookies() { const cookies = document.cookie.split(';'); cookies.forEach(cookie => { const [key, value] = cookie.split('=').map(c => c.trim()); if (key && value && !sessionStorage.getItem(key)) { sessionStorage.setItem(key, value); } }); } }