基于'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用法理念,既都是可以存储东西. 应用上下文:既变量共享 ...
随机推荐
- cas+tomcat+shiro实现单点登录-3-CAS服务器深入配置(连接MYSQL)
目录 1.tomcat添加https安全协议 2.下载cas server端部署到tomcat上 3.CAS服务器深入配置(连接MYSQL) 4.Apache Shiro 集成Cas作为cas cli ...
- 网络流——增广路算法(dinic)模板 [BeiJing2006]狼抓兔子
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #in ...
- 2016年的个人计划-xiangjiejie
过去一年,开发了angularjs的wap项目,appwap社区,忙忙碌碌不停的做各种活动. 职业目标 今年,要多看书,别总是被懒癌缠身. 多学习,过去半年很少看技术文章了吧,养成定期看文章的好习惯, ...
- leetcode_Search in Rotated Sorted Array II
Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...
- Android 编程:calledfromWrongThreadException 的原因
子线程更新UI会发生Android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法 子线程更新UI 显然假如你的程序需要执行耗时的操作的话,假如 ...
- poj:2992 因子数量
题意: 求 组合数c(n,k)的因子数量 由算术基本定理很容易求得,不过第一次却T了,加了好多预处理,o1查询,才过 #include <iostream> #include <st ...
- qq2013 java版(完整工程源码 包含服务端 oracle数据库)毕业设计有用
/** * 初始化组件 */ private void initComponent() { //提示面板 errorTipPane = new ErrorTipPane(); // 主面板 mainP ...
- JAVA中运用数组的四种排序方法
JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进 ...
- python高级编程:有用的设计模式1
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...
- Android Fragment详解(六):Fragement示例
把条目添加到动作栏 你的fragment们可以向activity的菜单(按Manu键时出现的东西)添加项,同时也可向动作栏(界面中顶部的那个区域)添加条目,这都需通过实现方法onCreateOptio ...