在项目中,前端的Cookies往往存一些用户的登录信息和AutoSuggest(基础信息)的东西。
如国家简写,Currency的Code等。
但是Cookies的空间是比较小的,多个用户登录一个系统,或者浏览器的cookies被其他应用占用,这时候Cookies的使用就变得很紧张。
Solution(解决方法)
1. 可以把项目中的一些信息有HTML5中的LocalStorage来承担部分的Cache工作,减轻Cookies的负担。
因为LocalStorage号称有10MB的空间。相比Cookies的空间大很多。
不同浏览器间 cookie 总大小也不同:
- Firefox 和 Safari 允许 cookie 多达 4097 个字节, 包括名(name)、值(value)和等号。
- Opera 允许 cookie 多达 4096 个字节, 包括:名(name)、值(value)和等号。
- Internet Explorer 允许 cookie 多达 4095 个字节, 包括:名(name)、值(value)和等号。
注:多字节字符计算为两个字节。在所有浏览器中,任何 cookie 大小超过限制都被忽略,且永远不会被设置。
- DCS.Common.suggestCookieStore = function(userId,time){
- //------------for cookie initialization
- var _rsProvider = DCS.Common.getCookieStore(userId,time);
- this.userId = userId;
- this.KeySeperator = '-.';
- this.ItemSeperator = '/.';
- var obj = _rsProvider.get(NSConst.Cookie.DCS) || {};
- var tmp = obj[this.userId];
- obj = {};
- obj[this.userId] = tmp; //delete other users cookie
- this.dcsObj = obj;
- this.store = function(key,obj){
- this.clear(key);
- var allStr = this.dcsObj[this.userId] || '';
- var str = '';
- if(allStr && allStr != '')
- str += this.ItemSeperator;
- str += key+this.KeySeperator+_rsProvider.encodeValue(obj);
- var length = str.length;
- if((length+DCS.Common.getCookieLength([NSConst.Cookie.DCS])) > 3300)
- this.clearLRU();
- if((length+DCS.Common.getCookieLength([NSConst.Cookie.DCS])) > 3300)
- this.clearLRU();
- var allStr = this.dcsObj[this.userId] || '';
- allStr += str;
- this.dcsObj[this.userId] = allStr;
- _rsProvider.set(NSConst.Cookie.DCS,this.dcsObj);
- };
- this.clearLRU = function(){
- var allStr = this.dcsObj[this.userId];
- if(allStr && allStr.length > 2){
- var start = allStr.indexOf(this.ItemSeperator) ;
- if(start > 0 && (start+2) < allStr.length){
- allStr = allStr.substring(start+2);
- this.dcsObj[this.userId] = allStr;
- _rsProvider.set(NSConst.Cookie.DCS,this.dcsObj);
- }
- }
- };
- this.get = function(key){
- var allStr = this.dcsObj[this.userId];
- if(allStr){
- if(allStr.length > (key.length+2) && allStr.indexOf(key+this.KeySeperator) > -1){
- var keyStr = key+this.KeySeperator;
- var start = allStr.indexOf(keyStr);
- var keyLength = keyStr.length;
- var end = allStr.indexOf(this.ItemSeperator,start);
- if(end < 0){
- end = allStr.length;
- }
- var result = allStr.substring(start+keyLength,end);
- return _rsProvider.decodeValue(result);
- }
- }
- return null;
- };
- this.clear = function(key){
- var allStr = this.dcsObj[this.userId];
- if(allStr){
- if(allStr.length > (key.length+2) && allStr.indexOf(key+this.KeySeperator) > -1){
- var keyStr = key+this.KeySeperator;
- var start = allStr.indexOf(keyStr);
- var end = allStr.indexOf(this.ItemSeperator,start);
- if(end < 0){
- if(start > 2)
- start -= 2; //if not the first item, need clear the sepeartor
- allStr = allStr.substring(0,start);
- }
- else{
- allStr = allStr.substring(0,start)+allStr.substring(end+2,allStr.length);
- }
- this.dcsObj[this.userId] = allStr;
- _rsProvider.set(NSConst.Cookie.DCS,this.dcsObj);
- }
- }
- };
- this.clearAll=function(){
- _rsProvider.clear(NSConst.Cookie.DCS);
- }
- };
2. 也可以用JS实时监控Cookie的使用情况,万一cookie使用超过预警值,那就要强制清空然后update。
至于怎么实现,项目中有具体的代码。