javascript用于存储的方式可谓是多种多样,善于应用‘存储’可以大大的提高网站的性能,博主结合日常开发常见需求做一下总结,希望对大家有用~

1.cookie

存储大小:   4kb左右,以20个为上限,
清理机制:  IE和Opera 会清理近期最少使用的cookie,Firefox会随机清理cookie。
主要应用:   购物车,登录状态
缺陷:         同域内http请求都会带cookie,浪费带宽
 

cookie常见携带参数

属性项 属性项介绍
name=
value
键值对,可以设置要保存的 Key/Value,注意这里的 NAME 不能和其他属性项的名字一样
Expires/
max-age
过期时间,在设置的某个时间点后该 Cookie 就会失效,如 expires=Wednesday, 09-Nov-99 23:12:40 GMT
Domain 生成该 Cookie 的域名,如 domain=”soulteary.com”
Path 该 Cookie 是在当前的哪个路径下生成的,如 path=/admin/
Secure 如果设置了这个属性,那么只会在 SSH 连接时才会回传该 Cookie
http http-only   true:cookie只能在服务器端读取和修改,比较安全

cookie安全

如果 Cookie 具有 HttpOnly 属性且不能通过客户端脚本访问,则为 true;否则为 false。默认为 false。

ie 6 +都支持属性 HttpOnly,该属性有助于缓解跨站点脚本威胁。

常见应用:

  • 使用原生js操作cookie
 document.cookie = name + '=' + escape(value);  //设置cookie  
//设置过期时间   
function setCookie(name,value)
{
var Days = 30;
var exp = new Date();
exp.setTime(exp.getTime() + Days*24*60*60*1000);
document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
}
//读取cookie  
function getCookie(name)
{
var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)"); //正则匹配
if(arr=document.cookie.match(reg)){ //使用match匹配,arr[0] 为匹配成功的字符串,比如" test1=2222",之后为()中逐个匹配到的值
       return unescape(arr[2]);
}
else{
return null;
}
}
 //删除cookie
function delCookie(name)
{
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval=getCookie(name);
if(cval!=null){
document.cookie= name + "="+cval+";expires="+exp.toGMTString();
}
}

2.localstorage

 
存储内容: 只要是能序列化成字符串的内容都可以存储,利用JSON.stringify();
存储大小: 5m
兼容性:    ie8+
主要应用:常用于ajax请求缓存
缺陷:      1. localstorage不被爬虫识别,所以不能用它完全取代url传參
               2. 不能跨域共享,所以不要用以存储业务关键信息,更加不要存储安全信息,(cookie可以通过window.name解决,但是localstorage不能)
 

常见应用:

  • 判断localstorage已经存储满了
 try {
localStorage.setItem(key, JSON.stringify({data: value, time: curTime}));
} catch (e) {
//如果存储满了,就全部删掉
localStorage.clear();//全部删除
localStorage.setItem(key, JSON.stringify({data: value, time: curTime}));
}
存储满后会抛出异常,只要捕获异常,再删除全部数据,即可。
  JSON.stringify(localStorage).length   可以查看当前使用了的大小,用5M减一下可以得出粗略的剩余大小(但是很不精确)
 
  • 判断localstorage已过期  (由于localstorage没有cookie的过期控制,需要自己控制)
 //封装过期控制代码
function set(key, value) {
var curTime = new Date().getTime();
try {
localStorage.setItem(key, JSON.stringify({data: value, time: curTime}));
} catch (e) {
//如果存储满了,就全部删掉
localStorage.clear();//全部删除
localStorage.setItem(key, JSON.stringify({data: value, time: curTime}));
}
}
function get(key, exp) {
var data = localStorage.getItem(key);
var dataObj = JSON.parse(data);
if (new Date().getTime() - dataObj.time > exp) {
localStorage.removeItem(key);//过期就清除key的值
console.log('信息已过期');
} else {
return JSON.stringify(dataObj.data);
}
}
  • 判断浏览器是否支持localstorage
 if (window.localStorage) {
console.log('This browser supports localStorage');
} else {
console.log('This browser does NOT support localStorage');
}
  • 常见api
 localStorage.setItem("b", str); //设置b的值
var b = localStorage.getItem("b"); //获取b
localStorage.clear();//全部删除
localStorage.removeItem(key);//清除key的值

3.sessionstorage

sessionStorage 在关闭页面后即被清空,而 localStorage 则会一直保存。其他与localstorage一样。
 
 

4.离线缓存(application cache)

兼容性:   ie 9 + 
主要应用:常用于静态资源缓存
存储大小:5m
缺陷:      由于原理上,application cache是把manifest上的资源一起下载下来,所以manifest里的内容不宜过多,数据量不宜过大;由于manifest的解析通常以页面刷新为触发点,且更新的缓存不会立即被使用,所以缓存的资源应以静态资源、更新频率比较低的资源为主。另外要做好对manifest文件的管理,由于清单内文件不可访问或manifest更新不及时造成的一些问题。
 

使用方法:

1.navigator.online  检测是否在线
 
2.浏览器向服务端发出请求, html标签中这样写: <html manifest="demo.appcache" >;
这样浏览器就会向请求其它资源一样向服务器请求这个名为 test.manifest文件了。
在服务器端添加 mime-type text/cache-manifest
 
3.配置test.manifest 文件

①CACHE MANIFEST – 在此标题下列出的文件将在首次下载后进行缓存

②NETWORK – 在此标题下列出的文件需要与服务器的连接,且不会被缓存

③FALLBACK – 在此标题下列出的文件规定当页面无法访问时的回退页面(比如 404 页面)

更新:只有server端的manifest文件改变,浏览器才会重新拉取离线数据,需要页面再次刷新(2次刷新才能获取新资源),更新是全局性的,无法单独更新某个文件。

 CACHE MANIFEST
# versin 1.0.0 //版本,若修改,则重新拉取
CACHE:
/theme.css //缓存该文件
/main.js
NETWORK: //不会被缓存的文件
login.jsp
FALLBACK: //回退页面
/html/ /offline.html
 
 

详解javascript 存储的更多相关文章

  1. 详解javascript的类

    前言 生活有度,人生添寿. 原文地址:详解javascript的类 博主博客地址:Damonare的个人博客 Javascript从当初的一个"弹窗语言",一步步发展成为现在前后端 ...

  2. 详解Javascript的继承实现(二)

    上文<详解Javascript的继承实现>介绍了一个通用的继承库,基于该库,可以快速构建带继承关系和静态成员的javascript类,好使用也好理解,额外的好处是,如果所有类都用这种库来构 ...

  3. 【转】详解JavaScript中的this

    ref:http://blog.jobbole.com/39305/ 来源:foocoder 详解JavaScript中的this JavaScript中的this总是让人迷惑,应该是js众所周知的坑 ...

  4. js对象详解(JavaScript对象深度剖析,深度理解js对象)

    js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...

  5. 详解 javascript中offsetleft属性的用法(转)

    详解 javascript中offsetleft属性的用法 转载  2015-11-11   投稿:mrr    我要评论 本章节通过代码实例介绍一下offsetleft属性的用法,需要的朋友可以做一 ...

  6. 详解javascript中的this对象

    详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的 ...

  7. 详解JavaScript调用栈、尾递归和手动优化

    调用栈(Call Stack) 调用栈(Call Stack)是一个基本的计算机概念,这里引入一个概念:栈帧. 栈帧是指为一个函数调用单独分配的那部分栈空间. 当运行的程序从当前函数调用另外一个函数时 ...

  8. 详解JavaScript的任务、微任务、队列以及代码执行顺序

    摘要: 理解JS的执行顺序. 作者:前端小智 原文:详解JavaScript的任务.微任务.队列以及代码执行顺序 思考下面 JavaScript 代码: console.log("scrip ...

  9. (转载)详解Javascript中prototype属性(推荐)

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

随机推荐

  1. Linux下Nagios的安装与配置[转]

    一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报 ...

  2. mysql5.6主从参数详解

    mysql5.6的主从相当的不错,增加了不少参数,提升了主从同步的安全和效率,以下是mysql5.6主从参数详解. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  3. spring Quartz 调度

    Quartz 是开源任务调度框架中的翘首,它提供了强大任务调度机制,同时保持了使用的简单性.Quartz 允许开发人员灵活地定义触发器的调度时间表,并可以对触发器和任务进行关联映射.此外,Quartz ...

  4. iCalendar格式中关于RRule的解析和生成

    最近在做一个关于Calendar的项目,相当于Google Calendar或者Outlook中的Calendar.在Calendar的发布和共享中,使用到了iCalendar,是一种日历数据交换的标 ...

  5. 【Python】-【类解析】--【脚本实例】

    通过脚本事例,解析下Python中类的几个概念在脚本中的应用 脚本如下: ++++++++++++++++++++++++++++++++++++++++ #!/usr/bin/env python# ...

  6. 这些web前端特效你造吗?

    友情提示:所有特效效果均是GIF图片演示(均有源码下载),所以这个博文可能加载的比较慢,请谅解. 凛冬将至(Winter Is Coming),在上一篇博客凛冬将至,用几款特效暖暖身得到了比较好的响应 ...

  7. SQL Server调优系列进阶篇(查询语句运行几个指标值监测)

    前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问 ...

  8. android 导入数据(通讯录)

    接着android 中导出数据 一文,下面介绍在android中导入数据的思路: 1.将数据从文本中读取出来 2.封装处理成自己想要的对象或模型 3.将处理好的数据对象插入自己应用的数据库中 4.更新 ...

  9. kernel启动console_init之前console不可用时发生crash的调试方法

    http://code.google.com/p/innosoc/wiki/KernelBootCrashDebug 注: 如在i386_start_kernel中加入:early_printk(&q ...

  10. Linux软件安装-RPM安装

    RPM是RPM Package Manager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux.         S ...