JSではブラウザCOOKIESのオーバーフローを防止する方法

12311 ワード

プロジェクトでは、フロントエンドのCookiesには、ユーザーのログイン情報やAutoSuggest(基礎情報)が格納されることが多い.
国の略記、CurrencyのCodeなど.
しかし、Cookiesのスペースは比較的小さく、複数のユーザーが1つのシステムにログインしたり、ブラウザのcookiesが他のアプリケーションに占有されたりすると、Cookiesの使用が緊張します.
Solution(解決方法)
1.プロジェクトの情報の一部をHTML 5のLocalStorageでCacheの一部を負担し、Cookiesの負担を軽減することができます.
LocalStorageには10 MBのスペースがあると言われているからです.Cookiesの空間よりずっと大きいです.
ブラウザ間のクッキーの合計サイズも異なります.
  • FirefoxおよびSafariは、名前(name)、値(value)、および等号を含むクッキーを4097バイトまで許可する.
  • Operaでは、名前(name)、値(value)、等号を含むクッキーを4096バイトまで許可します.
  • Internet Explorerでは、名前(name)、値(value)、および等号を含むクッキーを4095バイトまで許可します.

  • 注意:マルチバイト文字は2バイトとして計算されます.すべてのブラウザでは、クッキーのサイズが制限を超えても無視され、設定されません.
     
     
    
      
      
      
      
    1. DCS.Common.suggestCookieStore = function(userId,time){ 
    2.         //------------for cookie initialization 
    3.         var _rsProvider =  DCS.Common.getCookieStore(userId,time); 
    4.         this.userId = userId; 
    5.         this.KeySeperator = '-.'
    6.         this.ItemSeperator = '/.'
    7.         var obj = _rsProvider.get(NSConst.Cookie.DCS) || {}; 
    8.         var tmp = obj[this.userId];  
    9.         obj = {}; 
    10.         obj[this.userId] = tmp; //delete other users cookie 
    11.         this.dcsObj = obj; 
    12.         this.store = function(key,obj){ 
    13.              this.clear(key); 
    14.              var allStr = this.dcsObj[this.userId] || ''
    15.              var str = ''
    16.              if(allStr && allStr != ''
    17.                     str += this.ItemSeperator; 
    18.              str += key+this.KeySeperator+_rsProvider.encodeValue(obj); 
    19.              var length = str.length; 
    20.              if((length+DCS.Common.getCookieLength([NSConst.Cookie.DCS])) > 3300) 
    21.                             this.clearLRU(); 
    22.                  if((length+DCS.Common.getCookieLength([NSConst.Cookie.DCS])) > 3300) 
    23.                             this.clearLRU(); 
    24.              var allStr = this.dcsObj[this.userId] || ''
    25.                  allStr += str; 
    26.              this.dcsObj[this.userId] = allStr; 
    27.              _rsProvider.set(NSConst.Cookie.DCS,this.dcsObj); 
    28.           }; 
    29.           this.clearLRU = function(){ 
    30.                 var allStr = this.dcsObj[this.userId]; 
    31.                 if(allStr && allStr.length > 2){ 
    32.                     var start = allStr.indexOf(this.ItemSeperator) ; 
    33.                     if(start > 0 && (start+2) < allStr.length){ 
    34.                         allStr = allStr.substring(start+2); 
    35.                       this.dcsObj[this.userId] = allStr; 
    36.                         _rsProvider.set(NSConst.Cookie.DCS,this.dcsObj); 
    37.                     } 
    38.             } 
    39.           }; 
    40.           this.get = function(key){ 
    41.                 var allStr = this.dcsObj[this.userId]; 
    42.               if(allStr){ 
    43.                   if(allStr.length > (key.length+2) && allStr.indexOf(key+this.KeySeperator) > -1){ 
    44.                      var keyStr = key+this.KeySeperator; 
    45.                    var start = allStr.indexOf(keyStr); 
    46.                    var keyLength = keyStr.length; 
    47.                    var end = allStr.indexOf(this.ItemSeperator,start); 
    48.                    if(end < 0){ 
    49.                             end = allStr.length; 
    50.                    } 
    51.                    var result = allStr.substring(start+keyLength,end); 
    52.                    return _rsProvider.decodeValue(result); 
    53.                } 
    54.               } 
    55.               return null
    56.           }; 
    57.           this.clear = function(key){ 
    58.              var allStr = this.dcsObj[this.userId]; 
    59.              if(allStr){ 
    60.                        if(allStr.length > (key.length+2) && allStr.indexOf(key+this.KeySeperator) > -1){ 
    61.                           var keyStr = key+this.KeySeperator; 
    62.                           var start = allStr.indexOf(keyStr); 
    63.                           var end = allStr.indexOf(this.ItemSeperator,start); 
    64.                           if(end < 0){ 
    65.                                                         if(start > 2) 
    66.                                                               start -= 2; //if not the first item, need clear the sepeartor 
    67.                                           allStr = allStr.substring(0,start); 
    68.                           } 
    69.                           else
    70.                                          allStr = allStr.substring(0,start)+allStr.substring(end+2,allStr.length); 
    71.                           } 
    72.  
    73.                           this.dcsObj[this.userId] = allStr; 
    74.                            _rsProvider.set(NSConst.Cookie.DCS,this.dcsObj); 
    75.                 } 
    76.              } 
    77.       }; 
    78.       this.clearAll=function(){ 
    79.           _rsProvider.clear(NSConst.Cookie.DCS); 
    80.       } 
    81.     }; 


     


     

     


     
    2.JSでCookieの使用状況をリアルタイムで監視し、万が一cookieがアラート値を超えた場合は、強制的にクリアしてupdateすることもできます.
    どのように実現するかについては、プロジェクトには具体的なコードがあります.