基于'sessionStorage'与'userData'的类session存储
Storage.js:
注意:此版本实现的存储在符合Web存储标准(ie8及ie8以上的版本与其他主流浏览器)的情况下与session的周期一致,但在页面不关闭的情况下没有过期时间,ie7及以下版本则默认是永久保存,但可以通过预留的方法setMaxAge(Number age)来设置有效期,设置0的话在关闭或刷新页面时会清除缓存。
(function initStorageClass(win){var inherit=function(o){if(o===null || o ===undefined) throw TypeError();if(Object.create) return Object.create(o);var t = typeof o;if(t!=='object'&&t!=='function') throw TypeError();function f(){}f.prototype=o;return new f();};var extend=function(a,b){for ( var key in b) { a[key]=b[key]; }return a;};var defineSubclass=function(superclass,constructor,methods,statics){constructor.prototype=inherit(superclass.prototype);constructor.prototype.constructor=constructor;if(methods) extend(constructor.prototype,methods);if(statics) extend(constructor,statics);return constructor;};Function.prototype.extend=function(constructor,methods,statics){return defineSubclass(this,constructor,methods,statics);};// 创建一个抽象类var AbstractStorage=function AbstractStorage(){throw new Error('Can\'t create abstract class instance');};// 添加抽象类的实例方法(已实现) extend(AbstractStorage.prototype,{setItem:function(k,v){k=encodeURIComponent(k);v=encodeURIComponent(v);this.storage.setItem(k,v);return this;},getItem:function(k){k=encodeURIComponent(k);return decodeURIComponent(this.storage.getItem(k));},removeItem:function(k){k=encodeURIComponent(k);this.storage.removeItem(k);return this;},setMaxAge:function(age){ // 为IE的userData版本预留了设置有效期的方法if(isNaN(age)) throw new TypeError('userData\' max-age must be a number,but '+age+' is not a number');if(this.model&&this.model==='userData') {var now=new Date().getTime();var expires=now+age*1000;this.storage.expires=new Date(expires).toUTCString();} else {throw new Error('sessionStorage did\'t support set max-age。');}return this;}});var Storage=null;if(win.Storage) {// 实现了Web存储标准的浏览器Storage=AbstractStorage.extend(function WebStorage(){// IE中实现了Web存储标准的版本,在本地目录下无法使用sessonStorageif(!win.sessionStorage) {throw new Error('local web is can\'t save sessionStorage');}this.model='sessionStorage';// 默认使用sessionStorage,也可以自己传入,model自行修改this.storage=win.sessionStorage;});} else if(win.navigator.appVersion&&win.navigator.appVersion.indexOf('MSIE')>=0){// 不支持web存储标准的IE浏览器(IE11的核心版本已和Netscape统一,IE8以上的支持web存储标准)Storage=(AbstractStorage.extend(function IEStorage(maxAge){this.model='userData';this.maxAge=maxAge;this.storage=(function initUserData(t){var memory = document.createElement('div');memory.style.display='none';//附加userData行为memory.style.behavior='url("#default#userData")';document.appendChild(memory);if(t.maxAge) {// 设置userData有效期,默认永久,单位毫秒var now=new Date().getTime();var expires=now+t.maxAge*1000;memory.expires=new Date(expires).toUTCString();}memory.load('UserDataStorage'); //载入存储的 extend(memory,{setItem:function(k,v){this.setAttribute(k,v);this.save('UserDataStorage');return this;},getItem:function(k){return this.getAttribute(k)||null;},removeItem:function(k){this.removeAttribute(k);this.save('UserDataStorage');return this;}});return memory;}(this));}));}win.IStorage=Storage;win.memory=new Storage()||null;// 创建一个实例对象,可以在脚本中直接引用 }(window));
index.html(简单测试):
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="Storage.js"></script> <script type="text/javascript">window.onload=function(){memory.setItem('test','success');alert(memory.getItem('test'));}; </script> </head> <body></body> </html>
在HTML页面中引用Storage.js文件,可以在宿主环境中直接使用已经生成的实例memory(window.memory)。也可以自己创建一个新实例new IStorage()
memory.setItem('test','success'); // add alert(memory.getItem('test')); // select memory.removeItem('test'); // delete
适用实现了Web存储标准的浏览器(Storage)与IE浏览器(userData),userData的生命周期请自行根据项目进行设置。
转载于:https://www.cnblogs.com/gabin/p/3723892.html
基于'sessionStorage'与'userData'的类session存储相关推荐
- php获取sessionstorage,关于PHP session 存储方式的详细介绍
PHP为sesion的存储提供了三种方式: 文件/ 内存/ 自定义存储,默认是使用文件存储.在访问量大的网站上采用这种方式就不大合适,因为这样会导致大量的输入输出的冗余. 下面介绍一种基于Mysql数 ...
- C# redis 分布式session存储
https://github.com/uliian/SessionExtentionStore 一个基于Redis的Session存储扩展方案,解决ASP.NET中Session的局限性和跨应用程序使 ...
- Session 存储方式
简单来说,Session就是服务器给客户端的一个编号,当一台web服务器运行时,可能 是有多个用户都在浏览这台服务器上的网站,当每个用户首次与这台服务器建立连接时,它就与这个服务器建立了一个Sessi ...
- php session存到redis,php Session存储到Redis的方法
php Session存储到Redis的方法 当然要写先安装php的扩展,可参考这篇文章:Redis及PHP扩展安装修改php.ini的设置 复制代码 代码如下: session.save_handl ...
- [安卓] 12、开源一个基于SurfaceView的飞行射击类小游戏
前言 这款安卓小游戏是基于SurfaceView的飞行射击类游戏,采用Java来写,没有采用游戏引擎,注释详细,条理比较清晰,适合初学者了解游戏状态转化自动机和一些继承与封装的技巧. 效果展示 ...
- 从spring-session存储结构探讨session存储方案的演变
我们知道Spring Session 主要解决了分布式场景下 Session 的共享问题,本文将从 Spring Session 的源码出发,来讨论一些 Session 设计的细节. 一.Spring ...
- Flask 框架中 上下文基础理念,包括cookie,session存储方法,requset属性,current_app模块和g模块...
Flask中上下文,分为请求上下文和应用上下文.既状态留存 ,就是把变量存在某一个地方可以调用 请求上下文:实际就是request和session用法理念,既都是可以存储东西. 应用上下文:既变量共享 ...
- 基于品类关系,虚拟类目如何建设?
小叽导读:类目-属性项-属性值体系(简称CPV)是淘宝建设中非常重要的基石,在商品的发布.管理,以及搜索场景下都大量应用.比如每个商品都有自己的类目.以及属性,而且需要发布在适合自己的类目下,才能够方 ...
- php session传数组,php session存储数组
PHP面试干货 1.进程和线程 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性.进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一 ...
最新文章
- [导入]CSS: 不換行 寫法
- 双重ScrollView,RecyclerView联动实例
- android 对象数据库中,解析嵌套的JSON对象,并存储在数据库中的Android
- 福利满满 | 天元MegEngine贡献者计划全面启动!
- update empty content to text instance - where is B mode changed to D by frame
- java word批注_编写Java批注
- apt ubuntu 指定ipv4_怎么在ubuntu安装python
- 采用Jetty搭建简单的WebApplicationServer
- .NET在后置代码中输入JS提示语句(背景不会变白)
- 系统目录 linux命令,Linux系统目录和命令介绍
- 【一文读懂】Contours Hierarchy ——opencv边界的继承结构,表格的提取,表格孔洞处理,空心形状结构的提取
- 给定一个英文字符串,请写一段代码找出这个字符串中首先出现三次的那个英文字符(需要区分大小写)。
- python实现规则引擎_规则引擎python
- 2016阿里巴巴73款开源产品全向图
- 数据防泄密工作企业该如何开展
- Word文档插入图片的问题
- java-php-python-ssm-兴澜幼儿园管理系统-计算机毕业设计
- 英雄榜 此服务器当前正在维护中,《天下3》2021年全新山海经版本“再战黄泉”震撼登场!——网易《天下3》官方网站...
- SAMBA 基础及实战
- matlab设定坐标轴范围和坐标轴显示