zoukankan      html  css  js  c++  java
  • 关于 cookie 使用中遇到的问题

       前段时间在一个项目中涉及到cookie的存取,于是打算封装一个 cookie 的CRUD 。按理来说,这本身是一个很简单的问题,不注意的话简单的问题也有大坑。

      1 /**
      2  * Set or get cookie ;parse to object
      3  *
      4  *@date 2015-04-11
      5  *
      6  *@author 飘摇的枫叶
      7  *
      8  *
      9  *
     10  */
     11 'use strict';
     12 (function (window) {
     13     // class2type  refer to zepto.js $.type(obj) ## https://github.com/madrobby/zepto
     14     var class2type = {},
     15         toString = class2type.toString;
     16     "Boolean Number String Function Array Date RegExp Object Error".split(" ").forEach(function(name) {
     17         class2type["[object " + name + "]"] = name.toLowerCase();
     18     });
     19 
     20     var _qcookie = {
     21         cookies: document.cookie,
     22         get: function(name) {
     23             return this.all()[name];
     24         },
     25         /*
     26          *Set cookie
     27          *
     28          *@param    {string}  cookieName 
     29          *@param    {string}   cookieValue
     30          *  or
     31          *@param    {object}   cookieObject{key:value}
     32          *
     33          *@param    {object}   options{path:'/demo';domain:'/';expire:new Date();secure:0|1}
     34          */
     35         set: function(name, value, options) {
     36             var opt = options || {};
     37             if (!name) return;
     38             if (type(name) === 'string' && value) {
     39                 this.write(name, value, opt);
     40             } else if (type(name) === 'object') {
     41                 opt = value || {};
     42                 for (var k in name) {
     43                     this.write(k, name[k], opt);
     44                 }
     45             }
     46             // if (type(name) === 'string' && value) {
     47             //     str = encode(name) + '=' + encode(value) + '; ';
     48             // } else if (type(name) === 'object') {
     49             //     opt = value || {};
     50             //     for (var k in name) {
     51             //         str += encode(k) + '=' + encode(name[k]) + '; ';
     52             //     }
     53             // }
     54             // if (opt.path) str += 'path=' + opt.path;
     55             // if (opt.domain) str += 'domain=' + opt.domain;
     56             // if (opt.expires) str += 'expires=' + opt.expires.toUTCString();
     57             // if (opt.secure) str += 'secure';
     58             // document.cookie = str;
     59         },
     60         all: function() {
     61             return this.parse(this.cookies);
     62         },
     63         delete: function(name) {
     64             var expires = new Date();
     65             expires.setDate(expires.getDate() - 1);
     66             document.cookie = name + "=" + this.get(name) + '; expires=' + expires.toUTCString();
     67         },
     68         write: function(name, value, opt) {
     69             var str = encode(name) + '=' + encode(value);
     70             if (opt.path) str += '; path=' + opt.path;
     71             if (opt.domain) str += '; domain=' + opt.domain;
     72             if (opt.expires) str += '; expires=' + opt.expires.toUTCString();
     73             if (opt.secure) str += '; secure';
     74             document.cookie = str;
     75         },
     76         parse: function(cookieStr) {
     77             var obj = {};
     78             var arrs = cookieStr.split(/ *; */); // Similar with the split(';') + trim()
     79             var kv = [];
     80             if (arrs[0] == '') {
     81                 return obj;
     82             }
     83             for (var i = 0; i < arrs.length; i++) {
     84                 kv = arrs[i].split('=');
     85                 obj[decode(kv[0])] = decode(kv[1]);
     86             }
     87             return obj;
     88         }
     89     }
     90 
     91     function encode(str) {
     92         return encodeURIComponent(str);
     93     }
     94 
     95     function decode(str) {
     96         return decodeURIComponent(str);
     97     }
     98 
     99     function type(obj) {
    100         return obj == null ? String(obj) :
    101             class2type[toString.call(obj)] || "object"
    102     }
    103     window.qcookie = _qcookie;
    104 })(window)

      仔细一看你会发现这里面会有个很严重的问题,当不同域或者不同path的同名cookie 在读和删除的时候都会有问题 ,由于 cookie 的 domain , path 等属性是只写的,你读取到的两个cookie 结构可能是完全一样的,根本无法区分,类似这样,

    由于我采用的是将cookie parse 一个对象, 当你只传一个name 的时候,第二个 'aaa' 必然会将第一个 'aaa' 的值给覆盖掉,,这个问题一时间还真没想到什么好的办法解决,又或者设计的时候压根就没有考虑过这个问题,因为实际项目中可能并不会出现这么看上去很傻X的使用场景,然而多了解一点总是极好的。

    而删除的话,cookie 本身并没有提供删除的api , cookie 的删除完全是已写cookie的方式,加上一个失效时间,所以删除时指定path cookie 通过设置domain , path 还是可以做到的。

  • 相关阅读:
    CentOS 8搭建Kubernetes-k8s集群-1.18.5
    Docker、CICD持续集成部署、Gitlab使用、Jenkins介绍
    落地微服务架构v2.0
    分布式大规模服务调用架构
    .NetCore3.1+微服务架构技术栈
    ASP.NET MVC4 学习笔记-4
    ASP.NET MVC4 学习笔记-3
    SQL Server中获取不同格式的日期
    ASP.NET MVC4 学习笔记-2
    windows ce 5.0 + vs2005 + sql数据库_开发注意事项
  • 原文地址:https://www.cnblogs.com/albin-gecker/p/4456312.html
Copyright © 2011-2022 走看看