cookie、localStorage、sessionStorage

  • 都会在浏览器端保存,有大小限制,同源限制
  1. cookie:如果没有设置有效期则关闭浏览器就清除;适用于验证登录状态;cookie设置secure时要求HTTPS传输
    document.cookie="username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/";

有效期:非常短暂,存在于web浏览器会话期间,当浏览器关闭,cookie也就消失了。如果要延长cookie的有效期,可以设置max-age属性(单位秒)

作用域:通过domain和path决定。默认和创建它的web页面有关,该web页面同目录或者子目录页面可见。当设置path="/",它的作用域就变成文档源级别的了。
  1. sessionStorage:标签页关闭就清除;数据存储;针对一个session的数据存储

    有效期:窗口或者标签页被永久关闭,存储的数据也就失效了。

    作用域:文档源级别,⚠️通过点击链接(或者用了 window.open)打开的新标签页之间是属于同一个 session 的,但新开一个标签页总是会初始化一个新的 session,即使网站是一样的,它们也不属于同一个 session。

    所以我们在A网页中点击<a>,跳到B网页,可以获取sessionStorage;但是新开一个标签,访问同一个网页,获取不到

this.queryParams={name:this.insuredOneName,id:this.insuredOneID};
    sessionStorage.setItem('queryParam',JSON.stringify(this.queryParams))
  1. localStorage:永久保存,除非手动清除;数据存储;存储js文件,第一次访问页面时加载,以后访问时直接加载本地localStorage

    有效期:永不失效,除非web应用主动删除。

    作用域:localStorage的作用域是限定在文档源级别的。文档源通过协议、主机名以及端口三者来确定。

localStorage.setItem("key", "value");
var lastname = localStorage.getItem("key");
localStorage.removeItem("key");

cookie和session的区别

session是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。

session的时效性:Session在用户第一次访问服务器的时候自动创建。Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session,如果超过了超时时间没访问过服务器,Session就自动失效了。

Cookie和Session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用

新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。

关系登录访问下次继续访问时

Unicode编码:保存中文

中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码。

Cookie的安全属性

HTTP协议不仅是无状态的,而且是不安全的。使用HTTP协议的数据不经过任何加密就直接在网络上传播,有被截获的可能。使用HTTP协议传输很机密的内容是一种隐患。如果不希望Cookie在HTTP等非安全协议中传输,可以设置Cookie的secure属性为true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。下面的代码设置secure属性为true:

Cookie cookie = new Cookie("time", "20080808"); // 新建Cookie
cookie.setSecure(true); // 设置安全属性
response.addCookie(cookie); // 输出到客户端

W3C标准的浏览器会阻止JavaScript读写任何不属于自己网站的Cookie。换句话说,A网站的JavaScript程序读写B网站的Cookie不会有任何结果。

如何设计过期时间的localStorage

⚠️localStorage存进去时将对象转为json字符串,取出来是string

  • 存入数据时,加上一个时间戳expire,并且记录存入时间:time: Date.now()得到的是一串数字。
  • 读取数据时,先得到当前时间:Date.now(),做if判断: if (Date.now() - val.time > val.expire)
  • 如果结果为真,说明存储超时,则立即删除:localStorage.removeItem(key);并返回空null,否则返回数据:val.data
    class Storage {
        constructor(props) {
            this.props = props || {}
            this.source = this.props.source || window.localStorage
            this.initRun();
        }
        initRun(){
            /*
            * set 存储方法
            * @ param {String}     key 键
            * @ param {String}     value 值,存储的值可能是数组/对象,不能直接存储,需要转换 JSON.stringify
            * @ param {String}     expired 过期时间,以分钟为单位
            */
            const reg = new RegExp("__expires__");
            let data = this.source;
            let list = Object.keys(data);
            if(list.length > 0){
                list.map((key,v)=>{
                    if( !reg.test(key )){
                        let now = Date.now();
                        let expires = data[`${key}__expires__`]||Date.now+1;
                        if (now >= expires ) {
                            this.remove(key);
                        };
                    };
                    return key;
                });
            };
        }
    
        set(key, value, expired) {
            /*
            * set 存储方法
            * @ param {String}     key 键
            * @ param {String}     value 值,
            * @ param {String}     expired 过期时间,以毫秒为单位,非必须
            */
            let source = this.source;
            source[key] = JSON.stringify(value);
            if (expired){
                source[`${key}__expires__`] = Date.now() + expired
            };
            return value;
        }
    
        get(key) {
            /*
            * get 获取方法
            * @ param {String}     key 键
            * @ param {String}     expired 存储时为非必须字段,所以有可能取不到,默认为 Date.now+1
            */
            const source = this.source,
            expired = source[`${key}__expires__`]||Date.now+1;
            const now = Date.now();
        
            if ( now >= expired ) {
                this.remove(key);
                return;
            }
            const value = source[key] ? JSON.parse(source[key]) : source[key];
            return value;
        }
    
        remove(key) {
            const data = this.source,
                value = data[key];
            delete data[key];
            delete data[`${key}__expires__`];
            return value;
        }
   
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容