• 详解javascript 存储


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

     

    1.cookie

    存储大小:   4kb左右,以20个为上限,
    清理机制:  IEOpera 会清理近期最少使用的cookieFirefox会随机清理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
     1 document.cookie = name + '=' + escape(value);  //设置cookie  
     2 //设置过期时间   
     3 function setCookie(name,value)
     4 {
     5     var Days = 30;
     6     var exp = new Date();
     7     exp.setTime(exp.getTime() + Days*24*60*60*1000);
     8     document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
     9 } 
    10 //读取cookie  
    11 function getCookie(name)
    12 {
    13     var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)"); //正则匹配
    14     if(arr=document.cookie.match(reg)){  //使用match匹配,arr[0] 为匹配成功的字符串,比如" test1=2222",之后为()中逐个匹配到的值
    15       return unescape(arr[2]);
    16     }
    17     else{
    18      return null;
    19     }
    20 } 
     1 //删除cookie
     2 function delCookie(name)
     3 {
     4     var exp = new Date();
     5     exp.setTime(exp.getTime() - 1);
     6     var cval=getCookie(name);
     7     if(cval!=null){
     8       document.cookie= name + "="+cval+";expires="+exp.toGMTString();
     9     }
    10 } 

    2.localstorage

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

    常见应用:

    • 判断localstorage已经存储满了
    1 try {
    2     localStorage.setItem(key, JSON.stringify({data: value, time: curTime}));
    3 } catch (e) {
    4     //如果存储满了,就全部删掉
    5     localStorage.clear();//全部删除
    6     localStorage.setItem(key, JSON.stringify({data: value, time: curTime}));
    7 }
    存储满后会抛出异常,只要捕获异常,再删除全部数据,即可。
      JSON.stringify(localStorage).length   可以查看当前使用了的大小,用5M减一下可以得出粗略的剩余大小(但是很不精确)
     
    • 判断localstorage已过期  (由于localstorage没有cookie的过期控制,需要自己控制)
     1 //封装过期控制代码
     2 function set(key, value) {
     3     var curTime = new Date().getTime();
     4     try {
     5         localStorage.setItem(key, JSON.stringify({data: value, time: curTime}));
     6     } catch (e) {
     7         //如果存储满了,就全部删掉
     8         localStorage.clear();//全部删除
     9         localStorage.setItem(key, JSON.stringify({data: value, time: curTime}));
    10     }
    11 }
    12 function get(key, exp) {
    13     var data = localStorage.getItem(key);
    14     var dataObj = JSON.parse(data);
    15     if (new Date().getTime() - dataObj.time > exp) {
    16         localStorage.removeItem(key);//过期就清除key的值
    17         console.log('信息已过期');
    18     } else {
    19         return JSON.stringify(dataObj.data);
    20     }
    21 }
    • 判断浏览器是否支持localstorage
    1 if (window.localStorage) {
    2     console.log('This browser supports localStorage');
    3 } else {
    4     console.log('This browser does NOT support localStorage');
    5 }
    • 常见api
    1 localStorage.setItem("b", str); //设置b的值
    2 var b = localStorage.getItem("b");  //获取b
    3 localStorage.clear();//全部删除
    4 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次刷新才能获取新资源),更新是全局性的,无法单独更新某个文件。
    1 CACHE MANIFEST
    2 # versin 1.0.0      //版本,若修改,则重新拉取
    3 CACHE:   
    4   /theme.css   //缓存该文件
    5   /main.js
    6 NETWORK:      //不会被缓存的文件
    7   login.jsp
    8 FALLBACK:      //回退页面
    9   /html/ /offline.html
     
     
  • 相关阅读:
    获得H.264视频分辨率的方法
    学习Mathematica
    关于LaTeX公式排版
    关于Jordan标准形
    关于surface gradient
    Jacobi-Anger expansion
    两个1/x类的广义函数
    积分计算相关内容
    关于multi-index
    关于$mathcal{D}(0,1)$上的一个有趣结论
  • 原文地址:https://www.cnblogs.com/beidan/p/5927854.html
Copyright © 2020-2023  润新知