基于'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存储标准的版本,在本地目录下无法使用sessonStorage
if(!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的生命周期请自行根据项目进行设置。
基于'sessionStorage'与'userData'的类session存储的更多相关文章
- [转]mvc3 使用session来存储类来存储用户登陆信息
mvc3 使用session来存储类来存储用户登陆信息 2013-08-26 09:48:56| 分类: NET开发 |举报 |字号 订阅 项目之前的登陆机制是这样的:用户登陆后初始化一个类,类 ...
- C# redis 分布式session存储
https://github.com/uliian/SessionExtentionStore 一个基于Redis的Session存储扩展方案,解决ASP.NET中Session的局限性和跨应用程序使 ...
- [安卓] 12、开源一个基于SurfaceView的飞行射击类小游戏
前言 这款安卓小游戏是基于SurfaceView的飞行射击类游戏,采用Java来写,没有采用游戏引擎,注释详细,条理比较清晰,适合初学者了解游戏状态转化自动机和一些继承与封装的技巧. 效果展示 ...
- Jetty集群配置Session存储到MySQL、MongoDB
在Web开发中,Session表示HTTP服务器与客户端(例如浏览器)的“会话”,每个客户端会有其对应的Session保存在服务器端,通常用来保存和客户端关联的一些信息,例如是否登录.购物车等. Se ...
- Jetty容器集群配置Session存储到MySQL、MongoDB
在Web开发中,Session表示HTTP服务器与客户端(例如浏览器)的"会话",每个客户端会有其对应的Session保存在服务器端,通常用来保存和客户端关联的一些信息,例如是否登 ...
- 基于MongoDB打造.Net的分布式Session子系统
基于MongoDB打造.Net的分布式Session子系统 Taobao有她自己的分布式session框架,.net阵营也不能落后了,在下做了个基于MongoDB的支持最多26台MongoDB的分布式 ...
- 分布式集群下的Session存储方式窥探
传统的应用服务器,自身实现的session管理是大多是基于单机的,对于大型分布式网站来说,支撑其业务的远远不止一台服务器,而是一个分布式集群,请求在不同的服务器之间跳转.那么,如何保持服务器之前的se ...
- NET Core2.0 Memcached踩坑,基于EnyimMemcachedCore整理MemcachedHelper帮助类。
DotNetCore2.0下使用memcached缓存. Memcached目前微软暂未支持,暂只支持Redis,由于项目历史原因,先用博客园开源项目EnyimMemcachedCore,后续用到的时 ...
- Flask 框架中 上下文基础理念,包括cookie,session存储方法,requset属性,current_app模块和g模块
Flask中上下文,分为请求上下文和应用上下文.既状态留存 ,就是把变量存在某一个地方可以调用 请求上下文:实际就是request和session用法理念,既都是可以存储东西. 应用上下文:既变量共享 ...
随机推荐
- angularjs中ng-switch的用法
<!DOCTYPE html> <html lang="zh-CN" ng-app="app" ng-controller="ctr ...
- 在Yii2中使用Pjax导致Yii2内联脚本载入失败的问题
当我用defunkt/jquery-pjax载入Yii2的ActiveForm时发生一个错误,正常情况下是 ActiveForm的两个js应该先载入,而实际情况是 typeError:JQuery(. ...
- 认识 web 服务器端脚本语言 PHP
---恢复内容开始--- 变量 定义:定义之后,值可以改变的量.PHP中的变量可以先后赋值为不同类型的值. 语法格式:$变量名 = 值; 常量 定义:常量:一旦声明之后,值就不能再改变的量. 语法格式 ...
- SqlServer2008 新功能:简单数据加密
一.首先要把密码字段改成 varbinary 类型. CREATE TABLE [dbo].[UserInfo]( [id] [int] IDENTITY(1,1) NOT NULL, [name] ...
- NGINX当中的SSL配置(PEM启动密码免输入)
干过的都懂,这个东东好像很碍事. 很影响RELOAD的效率...并且,,,好像这个弄了之后,NGINX作RELOAD之后,可以即时更新配置了..(还是说那个DVROOT.CER影响的??未考证) ht ...
- QT下资源使用和资源占用…(可以动态加载资源文件,这样不占内存)
原文地址:关于QT下资源使用和资源占用内存过多的问题作者:技术成就梦想 最近研究了一下如何从外部动态调用图片的问题,从而研究了图片资源的使用方法.网上最常见的帖子是这个,感觉总结的还不错. h ...
- penetration testers渗透测试,hack,vnc,nat,
penetration testers渗透测试,hack,vnc,nat,
- WPF 控件之ComboBox绑定[2]
最近感觉新的方法Binding comboBox用起来很好用. 记录一下: <ComboBox Grid.Row=" x:Name="cboFamilyName" ...
- SQL 使用经验
1. 写存储过程,Update数据库表,一定要根据idRow,也就是主键唯一键来更新. 更新操作,如果根据其他条件更新,之后就有的忙活了. 2. Query语句要加NOLOCK
- 基于PCA的特征提取
图像处理方面的知识也学了一段时间了,总是光看理论的话,感觉联系不上实际,第一次把理论综合的实现出来,对这些理论的印象才感觉的更深刻,也能够为后续的学习打下良好的基础. PCA是比较老的算法,但是可靠性 ...