对cookie和子cookie操作的封装

  1 /**
  2  * 封装cookie的操作
  3  * @type {Object}
  4  */
  5 var CookieUtil = {
  6     /**
  7      * 根据cookie的名字获取相应的值
  8      * @param name cookie名字
  9      * @return {*}
 10      */
 11     get:function (name) {
 12         //对name进行URL编码
 13         var cookieName = encodeURIComponent(name) + '=',
 14             cookieStart = document.cookie.indexOf(cookieName),
 15             cookieValue = null;
 16         //找到cookieName
 17         if (cookieStart > -1) {
 18             //以cookieStart为起点找到最近的";"
 19             var cookieEnd = document.cookie.indexOf(';', cookieStart);
 20             //没找到";",则是document.cookie的最后一个值
 21             if (cookieEnd === -1) {
 22                 cookieEnd = document.cookie.length;
 23             }
 24             //提取相应value字段
 25             cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd));
 26         }
 27         //返回
 28         return cookieValue;
 29     },
 30     /**
 31      * 设置一个cookie
 32      * @param name cookie名字
 33      * @param value 相应的值
 34      * @param expire 生存周期 Date
 35      * @param path 路径
 36      * @param domain 域名
 37      * @param secure Boolean
 38      */
 39     set:function (name, value, expire, path, domain, secure) {
 40         //必须先进行URL编码
 41         var cookieText = encodeURIComponent(name) + '=' + encodeURIComponent(value);
 42         if (expire instanceof Date) {
 43             //toGMTString()方法正确格式化Date对象
 44             cookieText += '; expire=' + expire.toGMTString();
 45         }
 46         if (path) {
 47             cookieText += '; path=' + path;
 48         }
 49         if (domain) {
 50             cookieText += '; domain=' + domain;
 51         }
 52         if (secure) {
 53             cookieText += '; secure';
 54         }
 55         document.cookie = cookieText;
 56     },
 57     /**
 58      * 删除cookie
 59      * @param name
 60      * @param path
 61      * @param domain
 62      * @param secure
 63      */
 64     unset:function (name, path, domain, secure) {
 65         this.set(name, '', new Date(0), path, domain, secure);
 66     }
 67 };
 68 /*
 69  //set cookies
 70  CookieUtil.set(“name”, “Nicholas”);
 71  CookieUtil.set(“book”, “Professional JavaScript”);
 72  //read the values
 73  alert(CookieUtil.get(“name”)); //”Nicholas”
 74  alert(CookieUtil.get(“book”)); //”Professional JavaScript”
 75  //remove the cookies
 76  CookieUtil.unset(“name”);
 77  CookieUtil.unset(“book”);
 78  //set a cookie with path, domain, and expiration date
 79  CookieUtil.set(“name”, “Nicholas”, “/books/projs/”, “www.wrox.com”,
 80  new Date(“January 1, 2010”));
 81  //delete that same cookie
 82  CookieUtil.unset(“name”, “/books/projs/”, “www.wrox.com”);
 83  //set a secure cookie
 84  CookieUtil.set(“name”, “Nicholas”, null, null, null, true);
 85  */
 86 
 87 //子cookie的操作
 88 //为了绕开浏览器的单域名下的cookie数限制
 89 //子cookie是存放在单个cookie中的更小段的数据
 90 var SubCookieUtil = {
 91     /**
 92      * 获取单个子cookie的值
 93      * @param name cookie名称
 94      * @param subName 子cookie名称
 95      * @return {*}
 96      */
 97     get:function (name, subName) {
 98         var subCookies = this.getAll(name);
 99         if (subCookies) {
100             return subCookies(subName);
101         } else {
102             return null;
103         }
104     },
105     /**
106      * 获取所有子cookie并将它们放入一个对象中返回
107      * @param name cookie名称
108      * @return {*} 返回对象或null
109      */
110     getAll:function (name) {
111         var cookieName = encodeURIComponent(name) + "=",
112             cookieStart = document.cookie.indexOf(cookieName),
113             cookieValue = null,
114             result = {};
115         if (cookieStart > -1) {
116             var cookieEnd = document.cookie.indexOf(";", cookieName);
117             if (cookieEnd === -1) {
118                 cookieEnd = document.cookie.length;
119             }
120             //没有进行解码,因为要对子cookie分离操作
121             cookieValue = document.cookie.substring(cookieStart + cookieName.length, cookieEnd);
122             //
123             if (cookieValue.length > 0) {
124                 //分离出子cookie的对象
125                 var subCookies = cookieValue.split("&");
126                 //遍历分隔出子cookie的名称和值,解码后返回对象
127                 for (var i = 0, len = subCookies.length; i < len; i++) {
128                     var parts = subCookies[i].split("=");
129                     result[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
130                 }
131                 return result;
132             }
133         }
134         //没找到,返回空
135         return null;
136     },
137     /**
138      * 存储单个子cookie
139      * @param name cookie名称
140      * @param subName 子cookie名称
141      * @param value 子cookie值
142      * @param expires 失效日期
143      * @param path 路径
144      * @param domain 域名
145      * @param secure Boolean安全作用域
146      */
147     set:function (name, subName, value, expires, path, domain, secure) {
148         //获取name名称的所有子cookie,没有则创建空对象
149         var subcookies = this.getAll(name) || {};
150         //给对象添加属性和值
151         subcookies[subName] = value;
152         //调用setAll()方法
153         this.setAll(name, subcookies, expires, path, domain, secure);
154     },
155     /**
156      * 存储所有子cookie
157      * @param name cookie名称
158      * @param subcookies 子cookie名称
159      * @param expires 失效日期
160      * @param path 路径
161      * @param domain 域名
162      * @param secure Boolean安全作用域
163      */
164     setAll:function (name, subcookies, expires, path, domain, secure) {
165         var cookieText = encodeURIComponent(name) + "=";
166         //创建数组,用于保存子cookie
167         var subcookieParts = [];
168         //遍历对象属性
169         for (var subName in subcookies) {
170             //如果存在,则把编码后的名称和值保存到数组
171             if (subName.length > 0 && subcookies.hasOwnProperty(subName)) {
172                 subcookieParts.push(encodeURIComponent(subName) + "=" + encodeURIComponent(subcookies[subName]));
173             }
174         }
175         //存在子cookie
176         if (subcookieParts.length > 0) {
177             //连接子cookie
178             cookieText += subcookieParts.join("& ");
179             if (expires instanceof Date) {
180                 cookieText += ";expires=" + expires.toGMTString();
181             }
182             if (path) {
183                 cookieText += ";path=" + path;
184             }
185             if (domain) {
186                 cookieText += ";domain=" + domain;
187             }
188             if (secure) {
189                 cookieText += ";secure";
190             }
191         } else {
192             //相当于删除cookie操作
193             cookieText += ";expires=" + (new Date(0)).toGMTString();
194         }
195         document.cookie = cookieText;
196     },
197     /**
198      * 删除单个子cookie的名称和值
199      * @param name
200      * @param subName
201      * @param path
202      * @param domain
203      * @param secure
204      */
205     unset:function (name, subName, path, domain, secure) {
206         var subcookies = this.getAll(name);
207         if (subcookies) {
208             //删除对应的属性和值
209             delete subcookies[subName];
210             //重新设置cookie
211             this.setAll(name, subcookies, null, path, domain, secure);
212         }
213     },
214     /**
215      * 删除所有子cookie
216      * @param name
217      * @param path
218      * @param domain
219      * @param secure
220      */
221     unsetAll:function (name, path, domain, secure) {
222         this.setAll(name, null, new Date(0), path, domain, secure);
223     }
224 };
225 /*
226  //assume document.cookie=data=name=Nicholas&book=Professional%20JavaScript
227  //get all subcookies
228  var data = SubCookieUtil.getAll(“data”);
229  alert(data.name); //”Nicholas”
230  alert(data.book); //”Professional JavaScript”
231  //get subcookies individually
232  alert(SubCookieUtil.get(“data”, “name”)); //”Nicholas”
233  alert(SubCookieUtil.get(“data”, “book”)); //”Professional JavaScript”
234 
235  //assume document.cookie=data=name=Nicholas&book=Professional%20JavaScript
236  //set two subcookies
237  SubCookieUtil.set(“data”, “name”, “Nicholas”);
238  SubCookieUtil.set(“data”, “book”, “Professional JavaScript”);
239  //set all subcookies with expiration date
240  SubCookieUtil.setAll(“data”, { name: “Nicholas”, book: “Professional JavaScript” },
241  new Date(“January 1, 2010”));
242  //change the value of name and change expiration date for cookie
243  SubCookieUtil.set(“data”, “name”, “Michael”, new Date(“February 1, 2010”));
244 
245  //just remove the “name” subcookie
246  SubCookieUtil.unset(“data”, “name”);
247  //remove the entire cookie
248  SubCookieUtil.unsetAll(“data”);
249  */
原文地址:https://www.cnblogs.com/webFrontDev/p/2786022.html