分享一个web存储方法
https://github.com/zhujiasheng/jquery-cookie/blob/master/src/jquery.cookie.js
https://github.com/WQTeam/web-storage-cache
https://github.com/jeromegn/Backbone.localStorage/blob/master/backbone.localStorage.js#L63
/*
* WebStorageCache - 0.0.3
* https://github.com/WQTeam/web-storage-cache
*
* This is free and unencumbered software released into the public domain.
*/
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(factory);
} else if (typeof exports === 'object') {
module.exports = factory();
} else {
root.WebStorageCache = factory();
}
}(this, function () {
"use strict";
var _maxExpireDate = new Date('Fri, 31 Dec 9999 23:59:59 UTC');
var _defaultExpire = _maxExpireDate;
// https://github.com/jeromegn/Backbone.localStorage/blob/master/backbone.localStorage.js#L63
var defaultSerializer = {
serialize: function (item) {
return JSON.stringify(item);
},
// fix for "illegal access" error on Android when JSON.parse is
// passed null
deserialize: function (data) {
return data && JSON.parse(data);
}
};
function _extend (obj, props) {
for (var key in props) obj[key] = props[key];
return obj;
}
/**
* https://github.com/gsklee/ngStorage/blob/master/ngStorage.js#L52
*
* When Safari (OS X or iOS) is in private browsing mode, it appears as
* though localStorage is available, but trying to call .setItem throws an
* exception below: "QUOTA_EXCEEDED_ERR: DOM Exception 22: An attempt was
* made to add something to storage that exceeded the quota."
*/
function _isStorageSupported (storage) {
var supported = false;
if (storage && storage.setItem ) {
supported = true;
var key = '__' + Math.round(Math.random() * 1e7);
try {
storage.setItem(key, key);
storage.removeItem(key);
} catch (err) {
supported = false;
}
}
return supported;
}
// get storage instance
function _getStorageInstance (storage) {
var type = typeof storage;
if (type === 'string' && window[storage] instanceof Storage) {
return window[storage];
}
return storage;
}
function _isValidDate (date) {
return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime());
}
function _getExpiresDate (expires, now) {
now = now || new Date();
if (typeof expires === 'number') {
expires = expires === Infinity ?
_maxExpireDate : new Date(now.getTime() + expires * 1000);
} else if (typeof expires === 'string') {
expires = new Date(expires);
}
if (expires && !_isValidDate(expires)) {
throw new Error('`expires` parameter cannot be converted to a valid Date instance');
}
return expires;
}
// http://crocodillon.com/blog/always-catch-localstorage-security-and-quota-exceeded-errors
function _isQuotaExceeded(e) {
var quotaExceeded = false;
if (e) {
if (e.code) {
switch (e.code) {
case 22:
quotaExceeded = true;
break;
case 1014:
// Firefox
if (e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {
quotaExceeded = true;
}
break;
}
} else if (e.number === -2147024882) {
// Internet Explorer 8
quotaExceeded = true;
}
}
return quotaExceeded;
}
// cache item constructor
function CacheItemConstructor (value, exp) {
// createTime
this.c = (new Date()).getTime();
exp = exp || _defaultExpire;
var expires = _getExpiresDate(exp);
// expiresTime
this.e = expires.getTime();
this.v = value;
}
function _isCacheItem(item) {
if (typeof item !== 'object') {
return false;
}
if(item) {
if('c' in item && 'e' in item && 'v' in item) {
return true;
}
}
return false;
}
// check cacheItem If effective
function _checkCacheItemIfEffective(cacheItem) {
var timeNow = (new Date()).getTime();
return timeNow < cacheItem.e;
}
function _checkAndWrapKeyAsString(key) {
if (typeof key !== 'string') {
console.warn(key + ' used as a key, but it is not a string.');
key = String(key);
}
return key;
}
// cache api
var CacheAPI = {
set: function (key, value, options) {},
get: function (key) {},
delete: function (key) {},
// Try the best to clean All expires CacheItem.
deleteAllExpires: function() {},
// Clear all keys
clear: function () {},
// Add key-value item to memcached, success only when the key is not exists in memcached.
add: function (key, options) {},
// Replace the key's data item in cache, success only when the key's data item is exists in cache.
replace: function (key, value, options) {},
// Set a new options for an existing key.
touch: function (key, exp) {}
};
// cache api
var CacheAPIImpl = {
set: function(key, val, options) {
key = _checkAndWrapKeyAsString(key);
options = _extend({force: true}, options);
if (val === undefined) {
return this.delete(key);
}
var value = defaultSerializer.serialize(val);
var cacheItem = new CacheItemConstructor(value, options.exp);
try {
this.storage.setItem(key, defaultSerializer.serialize(cacheItem));
} catch (e) {
if (_isQuotaExceeded(e)) { //data wasn't successfully saved due to quota exceed so throw an error
this.quotaExceedHandler(key, value, options, e);
} else {
console.error(e);
}
}
return val;
},
get: function (key) {
key = _checkAndWrapKeyAsString(key);
var cacheItem = null;
try{
cacheItem = defaultSerializer.deserialize(this.storage.getItem(key));
}catch(e){
return null;
}
if(_isCacheItem(cacheItem)){
if(_checkCacheItemIfEffective(cacheItem)) {
var value = cacheItem.v;
return defaultSerializer.deserialize(value);
} else {
this.delete(key);
}
}
return null;
},
delete: function (key) {
key = _checkAndWrapKeyAsString(key);
this.storage.removeItem(key);
return key;
},
deleteAllExpires: function() {
var length = this.storage.length;
var deleteKeys = [];
var _this = this;
for (var i = 0; i < length; i++) {
var key = this.storage.key(i);
var cacheItem = null;
try {
cacheItem = defaultSerializer.deserialize(this.storage.getItem(key));
} catch (e) {}
if(cacheItem !== null && cacheItem.e !== undefined) {
var timeNow = (new Date()).getTime();
if(timeNow >= cacheItem.e) {
deleteKeys.push(key);
}
}
}
deleteKeys.forEach(function(key) {
_this.delete(key);
});
return deleteKeys;
},
clear: function () {
this.storage.clear();
},
add: function (key, value, options) {
key = _checkAndWrapKeyAsString(key);
options = _extend({force: true}, options);
try {
var cacheItem = defaultSerializer.deserialize(this.storage.getItem(key));
if (!_isCacheItem(cacheItem) || !_checkCacheItemIfEffective(cacheItem)) {
this.set(key, value, options);
return true;
}
} catch (e) {
this.set(key, value, options);
return true;
}
return false;
},
replace: function (key, value, options) {
key = _checkAndWrapKeyAsString(key);
var cacheItem = null;
try{
cacheItem = defaultSerializer.deserialize(this.storage.getItem(key));
}catch(e){
return false;
}
if(_isCacheItem(cacheItem)){
if(_checkCacheItemIfEffective(cacheItem)) {
this.set(key, value, options);
return true;
} else {
this.delete(key);
}
}
return false;
},
touch: function (key, exp) {
key = _checkAndWrapKeyAsString(key);
var cacheItem = null;
try{
cacheItem = defaultSerializer.deserialize(this.storage.getItem(key));
}catch(e){
return false;
}
if(_isCacheItem(cacheItem)){
if(_checkCacheItemIfEffective(cacheItem)) {
this.set(key, this.get(key), {exp: exp});
return true;
} else {
this.delete(key);
}
}
return false;
}
};
/**
* Cache Constructor
*/
function CacheConstructor (options) {
// default options
var defaults = {
storage: 'localStorage',
exp: Infinity //An expiration time, in seconds. default never .
};
var opt = _extend(defaults, options);
var expires = opt.exp;
if (expires && typeof expires !== 'number' && !_isValidDate(expires)) {
throw new Error('Constructor `exp` parameter cannot be converted to a valid Date instance');
} else {
_defaultExpire = expires;
}
var storage = _getStorageInstance(opt.storage);
var isSupported = _isStorageSupported(storage);
this.isSupported = function () {
return isSupported;
};
if (isSupported) {
this.storage = storage;
this.quotaExceedHandler = function (key, val, options, e) {
console.warn('Quota exceeded!');
if (options && options.force === true) {
var deleteKeys = this.deleteAllExpires();
console.warn('delete all expires CacheItem : [' + deleteKeys + '] and try execute `set` method again!');
try {
options.force = false;
this.set(key, val, options);
} catch (err) {
console.warn(err);
}
}
};
} else { // if not support, rewrite all functions without doing anything
_extend(this, CacheAPI);
}
}
CacheConstructor.prototype = CacheAPIImpl;
return CacheConstructor;
}));
//使用方式
function saveString_Obj(strName,strVal){
if(typeof strVal === 'object'){
strVal =JSON.stringify(strVal);
}
let wsCache = new WebStorageCache();
wsCache.set(strName, strVal, {exp : 300});
}
分享一个web存储方法的更多相关文章
- 分享一个web应用程序池管理工具
因为项目在联调阶段由于各种各样的原因需要重启应用程序池,而调试服务器基本都需要远登操作.同样的情况也会发生在线上,如果公司权限控制得比较严格,每次都要多部门的服务器权限申请的话有点麻烦, 所以抽点时间 ...
- 分享一个Web弹框类
using System; using System.Text; namespace Core { /// <summary> /// MessageBox 的摘要说明. /// < ...
- web存储方法,现成代码
1.cookie的设置与取用 function setCookie(cname,cvalue,exdays){ var d = new Date(); d.setTime(d.getTime()+(e ...
- 分享一个web安全学习站点
大神建议: https://blog.knownsec.com/Knownsec_RD_Checklist/v3.0.html#FMID_1218170279FM https://websec.rea ...
- Web存储机制—sessionStorage,localStorage使用方法
Web存储机制,在这里主要聊有关于Web Storage API提供的存储机制,通过该机制,浏览器可以安全地存储键值对,比使用cookie更加直观.接下来简单的了解如何使用这方面的技术. 基本概念 W ...
- 分享一个.NET(C#)按指定字母个数截断英文字符串的方法–提供枚举选项,可保留完整单词
分享一个.NET(C#)按字母个数截断英文字符串的方法,该方法提供枚举选项.枚举选项包括:可保留完整单词,允许最后一个单词超过最大长度限制,字符串最后跟省略号以及不采取任何操作等,具体示例实现代码如下 ...
- C# PDF Page操作——设置页面切换按钮 C# 添加、读取Word脚注尾注 C#为什么不能像C/C++一样的支持函数只读传参 web 给大家分享一个好玩的东西,也许你那块就用的到
C# PDF Page操作——设置页面切换按钮 概述 在以下示例中,将介绍在PDF文档页面设置页面切换按钮的方法.示例中将页面切换按钮的添加分为了两种情况,一种是设置按钮跳转到首页.下页.上页或者 ...
- 分享一个解决MySQL写入中文乱码的方法
分享一个解决MySQL写入中文乱码的方法 之前有发帖请教过如何解决MySQL写入中文乱码的问题.但没人会,或者是会的人不想回答.搜索网上的答案并尝试很多次无效,所以当时就因为这个乱码问题搁浅了一个软件 ...
- 分享一个解析XML成为php数组的方法
原文:分享一个解析XML成为php数组的方法 <?php /* * To change this template, choose Tools | Templates * and open th ...
随机推荐
- DataGridView 导出到Excel
#region 导出四个表格到Excel /// <summary> /// 导出四个表格到Excel /// </summary> /// <param name=&q ...
- 压测如何观测jvm,就是使用jmx来实现jvm监控
jps.jstack.jmap.jhat.jstat.hprof 基于jmx可以开发web版本,方便压测的时候观测jvm以及线程的信息 ================================ ...
- php 教程列表
php教程 php概述 php环境搭建 PHP书写格式 php变量 php常量 PHP注释 php字符串 string PHP整型 integer PHP浮点型 float php布尔型 php数据类 ...
- OpenSSL漏洞补救办法详解(转)
CVE-2014-0160漏洞背景 2014年4月7日OpenSSL发布了安全公告,在OpenSSL1.0.1版本中存在严重漏洞(CVE-2014-0160).OpenSSL Heartbleed模块 ...
- Linux系统下如何查看已经登录用户
查看用户的操作 系统管理员若想知道某一时刻用户的行为,只需要输入命令W 即可,在SHELL终端中输入如下命令: [ROOT@LOCALHOST ROOT] # W 2:31PM UP 11 DAY , ...
- 安卓手机屏幕录像之scr
打开SCR Screen Recorder,屏幕会显示录像控制面板,点击“开始”按钮就可以开始录像: - 停止录像的方法有两种.一种是锁屏,锁屏后等待2秒,录像文件会自动保存到SD卡,另外一种是重新打 ...
- JS-获取URL请求参数
前言:原来做过一个项目,需要实现一个页面打印的功能,由于项目中使用了AngularJS+Bootstrap等前端框架,需要打印的页面又在弹出框中,使用了Bootstrap的模态框后发现打印的效果不太好 ...
- Eclipse+MinGW+Boost环境搭建
一.编译 运行 .bat 生成bjam.exe 运行:bjam --build-type=complete toolset=gcc stage 二.配置 配置eclipse -L Path加入链接库位 ...
- angularjs上传图片
通过AngularJS实现图片上传及缩略图展示(读取文件内容) AngularJS图片上传功能的实现(读取文件内容) AngularJs实现Multipart/form-data 文件的上传(上传文件 ...
- 【SSM 4】Mybatis逆向生成工具
在上一篇博客中说到,Mybatis是灵活的SQL语句应用,不想Hibernate一样有其封装好的方法,那么,当我们用Mybatis的时候(Hibernate),我们都需要编写其实体类,和配置文件.本篇 ...