分享:JavaScript操作Cookie工具文件

版权所有:刺桐红-技术工作室  王重光 蓝文雄

声明:分享类型的文章均为我们工作室为了项目需求封装的工具类,本着分享合作的信念,其中如有错误,欢迎来信交流

lwx707@hotmail.com  2008-08-21

 

 

//====Config==开始========================================================
//***************************部署修改************************************
var config_strDomain= ""; //域名
                          //该域名在下面的Cookie操作方法中有用到,放空直接从URL路径中识别
                          //所以开发过程,我们放空,但部署后要设n0.cn,这样COOKIE才会对二级域名有效

//====Config==结束========================================================


//去掉字符串前后空格  使用 str*** = str***.Trim();
String.prototype.Trim = function()
{
   return this.replace(/(^\s+)|\s+$/g,"");
}


//====cookie操作==开始====================================================

//将COOKIE中使用的iExpires秒数转化为链接成document.cookie值的Expires串,如“;expires=***”
//(秒数),1表示10年有效,0表示不设有效时间,负数表示删除Cookie对象,大于等于2表示具体有效秒数,31536000秒=1年=(60*60*24*365)
function CookieExpires(iExpires)
{
    if(iExpires != 0)
    {
        if(iExpires==1)
        {
            var expiresDate = new Date((new Date()).getTime() + 315360000 * 1000).toGMTString();
        }
        else   
        { 
            var expiresDate = new Date((new Date()).getTime() + iExpires * 1000).toGMTString();
        }
        return ";expires="+expiresDate;
    }
    else
    {
        return "";
    }
}
//将COOKIE中使用的域strDomain转化为链接成document.cookie值的domain串,如“;domain=***”
function CookieDomain(strDomain)
{  //***************************部署修改************************************
    if(strDomain == "" || strDomain == null)
    {
        if(config_strDomain == "")                ////////////////////////////////////////////////////////////////////
        {                                         /////////////////////
            return "";                            /////////////////////  当系统部署后,系统将在带“.”的域下工作
        }                                         /////////////////////  上面的config_strDomain也必设有值
        else                                      /////////////////////  所以这段话可以删掉,只需用一句话就可以了:
        {                                         /////////////////////  就是“return ";domain="+config_strDomain;”
            return ";domain="+config_strDomain;   /////////////////////
        }                                         ////////////////////////////////////////////////////////////////////
    }
    else
    {
            return ";domain="+strDomain;
    }
}
//将COOKIE中使用的作用路径strPath转化为链接成document.cookie值的path串,如“;path=***”
function CookiePath(strPath)
{
    if(strPath == "" || strPath == null)
    {
        return "";
    }
    else
    {
        return ";path="+strPath;
    }
}


/// 创建COOKIE对象并赋Value值
/// <summary>
/// 创建COOKIE对象并赋Value值,修改COOKIE的Value值也用此方法,因为对COOKIE修改必须重新设Expires
/// 使用:当只设Path而不设Domain时:SetCookieObj_Value("***","****",****,"","****");
/// </summary>
/// <param name="strCookieName">COOKIE对象名</param>
/// <param name="iExpires">COOKIE对象有效时间(秒数),1表示10年有效,0表示不设有效时间,负数表示删除Cookie对象,大于等于2表示具体有效秒数,31536000秒=1年=(60*60*24*365)</param>
/// <param name="strValue">COOKIE对象Value值</param>
/// <param name="strDomain">COOKIE对象作用域</param>
/// <param name="strPath">COOKIE对象作用路径</param>
function SetCookieObj_Value(strCookieName,strValue,iExpires,strDomain,strPath)
{   //***************************部署修改************************************
    if(strCookieName == "" || strCookieName == null)    ////////////////////////////////////////////////////////////////
    {                                                   ////////////////////////////////////////////////////////////////
        alert("“strCookieName”不可为空");             ////////////////////////////////////////////////////////////////
    }                                                   ////////
    if(strValue == null)                                ////////         这一部分,
    {                                                   ////////                    当系统部署时可以去掉                   
        alert("“strValue”不可为空");                  ////////
    }                                                   ////////             因为其作用只是在开发过程中进行报错 
    if(iExpires == "" || iExpires == null)              ////////
    {                                                   ////////////////////////////////////////////////////////////////
        alert("“iExpires”不可为空");                  ////////////////////////////////////////////////////////////////
    }                                                   ////////////////////////////////////////////////////////////////
    document.cookie = strCookieName.Trim() + "=" + encodeURIComponent(strValue.Trim()) + CookieExpires(iExpires) + CookieDomain(strDomain) + CookiePath(strPath);
}
/// 创建COOKIE对象并赋Value值(仅用于KEY修改操作时用,因为没有进行编码)
/// <summary>
/// 创建COOKIE对象并赋Value值(仅用于KEY修改操作时用,因为没有进行编码)
/// 使用:当只设Path而不设Domain时:SetCookieObj_Edit("***","****",****,"","****");
/// </summary>
/// <param name="strCookieName">COOKIE对象名</param>
/// <param name="iExpires">COOKIE对象有效时间(秒数),1表示10年有效,0表示不设有效时间,负数表示删除Cookie对象,大于等于2表示具体有效秒数,31536000秒=1年=(60*60*24*365)</param>
/// <param name="strValue">COOKIE对象Value值</param>
/// <param name="strDomain">COOKIE对象作用域</param>
/// <param name="strPath">COOKIE对象作用路径</param>
function SetCookieObj_Edit(strCookieName,strValue,iExpires,strDomain,strPath)
{   //***************************部署修改************************************
    if(strCookieName == "" || strCookieName == null)    ////////////////////////////////////////////////////////////////
    {                                                   ////////////////////////////////////////////////////////////////
        alert("“strCookieName”不可为空");             ////////////////////////////////////////////////////////////////
    }                                                   ////////
    if(strValue == null)                                ////////         这一部分,
    {                                                   ////////                    当系统部署时可以去掉                   
        alert("“strValue”不可为空");                  ////////
    }                                                   ////////             因为其作用只是在开发过程中进行报错 
    if(iExpires == "" || iExpires == null)              ////////
    {                                                   ////////////////////////////////////////////////////////////////
        alert("“iExpires”不可为空");                  ////////////////////////////////////////////////////////////////
    }                                                   ////////////////////////////////////////////////////////////////
    document.cookie = strCookieName.Trim() + "=" + strValue + CookieExpires(iExpires) + CookieDomain(strDomain) + CookiePath(strPath);
}
/// 创建COOKIE对象并赋多个KEY键值
/// <summary>
/// 创建COOKIE对象并赋多个KEY键值
/// 1、使用:当只设Path而不设Domain时:SetCookieObj_Key("***","****",****,"","****");
/// 2、设键/值如下:
///    var user = new Array();
///    user[0]={keyName:"lwx",keyValue:"2008"}; 
///    user[1]={keyName:"lwx11",keyValue:"2009"}; 
///    访问:user[0].keyName=lwx   user[0].keyValue=2008
///    访问:user[1].keyName=lwx11   user[1].keyValue=2009
/// </summary>
/// <param name="strCookieName">COOKIE对象名</param>
/// <param name="iExpires">COOKIE对象有效时间(秒数),1表示10年有效,0表示不设有效时间,负数表示删除Cookie对象,大于等于2表示具体有效秒数,31536000秒=1年=(60*60*24*365)</param>
/// <param name="KeyValue">键/值对集合</param>
/// <param name="strDomain">COOKIE对象作用域</param>
/// <param name="strPath">COOKIE对象作用路径</param>
function SetCookieObj_Key(strCookieName,KeyValue,iExpires,strDomain,strPath)
{   //***************************部署修改************************************
    if(strCookieName == "" || strCookieName == null)                 ////////////////////////////////////////////////////////////////
    {                                                                ////////////////////////////////////////////////////////////////
        alert("“strCookieName”不可为空");                          ////////////////////////////////////////////////////////////////
        return;                                                      ////////////////////////////////////////////
    }                                                                ////////////////////////////////////////////////////////////////
    for(var i=0;i < KeyValue.length;i++)                             ////////////////////////////////////////////////////////////////
    {                                                                ////////////////////////////////////////////////////////////////
        if(KeyValue[i].keyName =="" || KeyValue[i].keyName == null)  ////////
        {                                                            ////////
            alert("“keyName”不可为空");                            ////////
            return;                                                  ////////  这一部分,
        }                                                            ////////          当系统部署时可以去掉
        if(KeyValue[i].keyValue == null)                             ////////            因为其作用只是在开发过程中进行报错 
        {                                                            ////////
            alert("“KeyValue”不可为空");                           ////////
            return;                                                  ////////
        }                                                            ////////////////////////////////////////////////////////////////
    }                                                                ////////////////////////////////////////////////////////////////
    if(iExpires == "" || iExpires == null)                           ////////////////////////////////////////////////////////////////
    {                                                                ////////////////////////////////////////////////////////////////
        alert("“iExpires”不可为空");                               ////////////////////////////////////////////////////////////////
        return;                                                      ////////////////////////////////////////////////////////////////
    }                                                                ////////////////////////////////////////////////////////////////
   
    var strValue="";
    for(var i=0;i < KeyValue.length;i++)
    {  
        var keyName=KeyValue[i].keyName.Trim();
        var keyValue=encodeURIComponent(KeyValue[i].keyValue.Trim());
        strValue += keyName;
        strValue += "=";
        strValue += keyValue;
        if(i==KeyValue.length-1)
        {
            break;
        }
        strValue += "&";
    }
   
    document.cookie = strCookieName.Trim() + "=" + strValue + CookieExpires(iExpires) + CookieDomain(strDomain) + CookiePath(strPath);
}

/// 读取Cookie某个对象的Value值
/// <summary>
/// 读取Cookie某个对象的Value值
/// </summary>
/// <param name="strCookieName">Cookie对象名称</param>
/// <returns>Value值,如果对象本就不存在,则返回字符串"CookieNonexistence"</returns>
function  GetCookieObjValue(strCookieName)
{
    var strAllCookies=document.cookie;          //获取所有Cookie对象,以字符串形式返回(如:objName1=objCo1;objName2=objCo2;objName3=keyName1=keyValue1&keyName2=keyValue2)
 var arrayCookies=strAllCookies.split(';');  //分离Cookie对象,返回Cookie对象数组,cookie对象间是以;分隔

    for(var i=0;i<arrayCookies.length;i++)      //读取各个Cookie对象
    {       
        var cookieObj=arrayCookies[i].Trim();             //第i个cookie对象
        var iStartPos = cookieObj.indexOf(strCookieName+"=");
        if(iStartPos == 0)
        {
            var strObjValue = cookieObj.replace(strCookieName+"=","");
            var iIsEqualSign = strObjValue.indexOf("=");
            if(iIsEqualSign == -1)
            {
                return decodeURIComponent(strObjValue);
            }
            else
            {
                return strObjValue;
            }
        }
        var iIsEqualSign = cookieObj.indexOf("=");
        if(iIsEqualSign == -1)  //说明Cookie的Value值为空
        {
            return "";
        }
    }
    return "CookieNonexistence";
}

/// 读取Cookie某个对象的某个Key键的键值
/// <summary>
/// 读取Cookie某个对象的某个Key键的键值
/// </summary>
/// <param name="strCookieName">Cookie对象名称</param>
/// <param name="strKeyName">Key键名</param>
/// <returns>Key键值,如果对象本就不存在,则返回字符串"CookieNonexistence",如果Key键不存在,则返回字符串"KeyNonexistence"</returns>
function  GetCookieKeyValue(strCookieName,strKeyName)
{
    var strValue = GetCookieObjValue(strCookieName).Trim();
    if(strValue=="CookieNonexistence")
    {
        return "CookieNonexistence";
    }
    var arrayKey=strValue.split('&'); 
    for(var j=0;j<arrayKey.length;j++)
    {
        var arrayKeyAndValue=arrayKey[j].split('=');  //得到某个键名与键值组成的只有两个元素的数组
        if(strKeyName==arrayKeyAndValue[0])
        {
            return decodeURIComponent(arrayKeyAndValue[1]);
        }
    }
    return "KeyNonexistence";
}

/// 修改某个COOKIE对象某个Key键的键值 或 给某个COOKIE对象添加Key键 都调用本方法
/// <summary>
/// 修改某个COOKIE对象某个Key键的键值 或 给某个COOKIE对象添加Key键 都调用本方法
/// </summary>
/// <param name="strCookieName">Cookie对象名称</param>
/// <param name="strKeyName">Key键名</param>
/// <param name="strKeyValue">Key键值</param>
/// <param name="iExpires">COOKIE对象有效时间(秒数),1表示永久有效,0表示不设有效时间,负数表示删除Cookie对象,大于等于2表示具体有效秒数,31536000秒=1年=(60*60*24*365)。注意:虽是修改功能,实则重建覆盖,所以时间也要重设,因为没办法获得旧的有效期</param>
/// <returns>如果对象本就不存在,则返回字符串"CookieNonexistence",如果操作成功返回字符串"success"。</returns>
function EditCookieKey(strCookieName,strKeyName,strKeyValue,iExpires)
{  
    var strOldKeyValue = GetCookieKeyValue(strCookieName,strKeyName);
    if(strOldKeyValue=="CookieNonexistence")
    {
         return "CookieNonexistence";
    }
    if(strOldKeyValue=="KeyNonexistence")  //找不到键,以下直接添加键/值对
    {
        var strObjValue = GetCookieObjValue(strCookieName);
        if(strObjValue == "") //对象的值都为空了,那么键就不用加“&”
        {
            strObjValue += strKeyName+"=";
            strObjValue += encodeURIComponent(strKeyValue.Trim());
        }
        else
        {
            strObjValue += "&"+strKeyName+"=";
            strObjValue += encodeURIComponent(strKeyValue.Trim());
        }
        SetCookieObj_Edit(strCookieName,strObjValue,iExpires);  //这里会出现一种情况,就是strObjValue本身只是简单字符串,那么加了键/值对,结果的strObjValue就不是纯字符串,也不是纯键值对,而是二者并存,我们在使用中要尽量避免这种情况的产生。
        return "success";      
    }
    else   //找到键,以下进行修改键/值对
    {
        var strOldKeyValue = GetCookieKeyValue(strCookieName,strKeyName);
        var strOldKeyString = strKeyName +"="+encodeURIComponent(strOldKeyValue);
        var strNewKeyString = strKeyName +"="+encodeURIComponent(strKeyValue.Trim());
        var strObjValue = GetCookieObjValue(strCookieName);
        var strObjNewValue = strObjValue.replace(strOldKeyString,strNewKeyString);
        SetCookieObj_Edit(strCookieName,strObjNewValue,iExpires);
        return "success";
    }
}

/// 删除COOKIE对象
/// <summary>
/// 删除COOKIE对象
/// </summary>
/// <param name="strCookieName">Cookie对象名称</param>
function DelCookie(strCookieName)
{
    var strObjValue = GetCookieObjValue(strCookieName);
    if(strObjValue=="CookieNonexistence")
    {
        return;
    }
    SetCookieObj_Value(strCookieName,"",-1);  
}

/// 删除某个COOKIE对象某个Key子键
/// <summary>
/// 删除某个COOKIE对象某个Key子键
/// </summary>
/// <param name="strCookieName">Cookie对象名称</param>
/// <param name="strKeyName">Key键名</param>
/// <param name="iExpires">COOKIE对象有效时间(秒数),1表示永久有效,0表示不设有效时间,负数表示删除Cookie对象,大于等于2表示具体有效秒数,31536000秒=1年=(60*60*24*365)。注意:虽是删除功能,但只是删除某键,整个Cookie对象实则重建覆盖,所以时间也要重设,因为没办法获得旧的有效期</param>
/// <returns>如果对象本就不存在,则返回字符串"CookieNonexistence",找不到KEY键盘,返回"KeyNonexistence",如果操作成功返回字符串"success"。</returns>
function DelCookieKey(strCookieName,strKeyName,iExpires)
{  
    var strOldKeyValue = GetCookieKeyValue(strCookieName,strKeyName);
    if(strOldKeyValue=="CookieNonexistence")
    {
         return "CookieNonexistence";
    }
    if(strOldKeyValue=="KeyNonexistence")  //找不到键
    {
        return "KeyNonexistence";    
    }
    else   //找到键,以下进行修改键/值对
    {
        var strKeyValue = GetCookieKeyValue(strCookieName,strKeyName);
        var strKeyString = strKeyName +"="+encodeURIComponent(strKeyValue);
        var strObjNewValue ="";
        var strObjValue = GetCookieObjValue(strCookieName);
        var iIsOneKey = strObjValue.indexOf("&"+strKeyString);
        if(iIsOneKey == -1)  //说明是第一个键
        {
            strObjNewValue = strObjValue.replace(strKeyString+"&","");  //后面还有键时,但也有可能后面没有键,那这句话就删除不掉了
            strObjNewValue = strObjNewValue.replace(strKeyString,"");   //后面没有键时,多加这句话,确保成功删除
        }
        else
        {
            strObjNewValue = strObjValue.replace("&"+strKeyString,"");
        }
        SetCookieObj_Edit(strCookieName,strObjNewValue,iExpires);
        return "success";
    }
}

//====cookie操作==结束========================================================

posted @ 2008-08-21 08:33  蓝色乌托邦  阅读(254)  评论(0编辑  收藏  举报