本地存储的跨域共享
2018-9-20
| 2024-10-1
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password

前言

很多项目需要通过cookie来共享一些数据,其中有两个大cookie总长度高达1000,大大增加了服务器开销; 考虑使用本地存储来优化;然而各个项目都在不同的子域名下,需要支持跨域,所以暂定使用iframe方案来处理;

设计思路

  • 通过iframe加载一个特定域名下的proxy.html,在这个html内部保存数据;
  • 其它项目通过引用一个storageProxy.js,动态注入这个iframe,然后通过window.postMessage来交换数据;

代理页面

  1. 初始化时监听window的message,用于处理父页面发送过来的消息;
  1. 在message的处理函数中过滤来源域名以及事件类型;
  1. 处理对应的事件类型后选择是否把处理结果传递回去,通常只有取数据需要返回,其它假设为一定成功;

代理js

  1. 注入iframe到当前页面;
  1. 提供事件处理函数用于快捷调用;

存在的缺陷

  1. 因为iframe跨域,无法监听加载完成事件;
  1. iframe的加载受页面资源加载的影响,因此无法在初始化时使用;
  1. iframe的初始化和存取数据的调用都是以回调的形式实现的,用起来不够方便;

优化方案(对应上述缺陷)

  1. iframe加载成功后需要发送消息给父页面,告知自己加载完成;
  1. 因为加载完成时间不可控,在页面初始化时,需要把原有逻辑调整为以更新的形式处理,而不是waiting数据;
  1. 需要把现有的回调,使用语法糖包装为promise或者async await(考虑兼容性,只能以callback的形式提供,要在各个项目内部封装), 减少原有同步逻辑的调整;

代码实现proxy.html

代码实现storageProxy.js

测试代码

其它

  • 后边在网上搜了下同类方案,发现了postmate,建议使用此库;
  • 开发
  • 使用docker部署JenkinsCookie便捷操作
    Loading...