封装简易的cookie处理

511 阅读1分钟

先上代码

cookie:{
        getCookie:function (name){
            let val = ""
            let reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)")
            let tokenInfo = document.cookie.match(reg) // 通过上式正则取到cookie中带 name变量 的字段
            if(tokenInfo){
                val = tokenInfo[2]
            }
            return val
        },
        setCookie:function (name,value){
            document.cookie = name + "=" + value
        }
    }

由这个简易的封装来复习一下,正则的match方法和,原生的document.cookie。

1 正则表达式中的match

使用正则表达式模式对字符串执行查找,并且将包含查找的结果作为数组返回。

语法:stringObj.match(rgExp)

  • stringObj:必选项,对其进行查找的String对象或字符串。
  • RgExp:必选项。为包含正则表达式模式和可用标志的正则表达式对象,也可以是包含正则表达式模式和可用标志的变量名或字符串文字。
  • 如果 match 方法没有匹配,则返回null
  • 如果找到匹配,返回一个数组并且更新全局 RegExp 对象的属性以反映匹配结果
  • match 方法返回的数组有 3 个属性:input ,index 和 lastIndex
    • Input 属性包含整个被查找的字符串
    • Index属性包含了在整个被查找字符串中匹配的子字符串的位置
    • LastIndex属性包含了最后一次匹配中最后一个字符串的下一个位置 如果没有设置全局标志(g),数组的0元素包含整个匹配,而第1到n元素包含了匹配中曾出现过的任一个子匹配,这相当于没有设置全局标志的exec方法。 如果设置了全局标志,则元素0 - n 中包含所有匹配。

match 方法使用例

<script language="Javascript">
function MatchDemo() {
            let r; // 声明变量
            let re;
            let s = " I am a good boy"
            re = /boy/i; // 创建正则表达式模式 - 没有全局标识 g
            r = s.match(re); // 尝试匹配搜索字符串
            return r; //返回第一次出现 "boy" 的地方
        }
        function MatchDemo1() {
            let r; // 声明变量
            let re;
            let s = "I am a good boy,but not boys !";
            re = /boy/ig; // 创建正则表达式模式 - 有全局标识 g
            r = s.match(re); // 尝试去匹配搜索字符串
            return r; // 返回的数组包含了所有 "boy" 出现的两个匹配
        }
        document.write(MatchDemo())
        document.write("<BR>")
        document.write(MatchDemo1())
</script>

运行结果

boy
boy,boy

2 原生的 document.cookie

在讲这个属性之前,我们先来聊一聊 什么是cookie

什么是cookie?

cookie是存储于访问者的计算机中的变量,每当同一台计算机通过浏览器请求某个页面时,就会发送这个cookie,你可以使用 Javascript 来创建和取回 cookie 的值。

设置cookie

每个 cookie 都是一个 键/值对 ,可以把下面这样一个字符串赋值给 document.cookie document.cookie = "userId=9527";
document.cookie 看上去就像一个属性,可以赋不同的值,但它和一般的属性不一样,改变他的赋值并不意味着丢失原来的值,例如连接执行下面两条语句: document.cookie="userId=9527"
document.cookie="Metpoid"
;
这时浏览器将维护两个cookie,分别是 userId 和 userName,因此给document.cookie赋值更像执行类似这样的语句:
document.addCookie("userId=9527");
document.addCookie("userName=Metpoid")


事实上,浏览器就是按照这样的方式来设置 cookie 的,如果要改变一个cookie 的值,只需要重新赋值,例如:
document.cookie="userId=1234"
这样就将名为 userId 的 cookie 值设置成了1234。

获取cookie 的值

下面介绍如何获取cookie 的值,cookie 的值可以由 document.cookie直接获得:
let strCookie=document.cookie;
这将获得以分号隔开的多个 键/值对 所组成的字符串,这些 键/值对包括了该域名下的所有cookie。
document.cookie="userId=9527";
document.cookie="userName=Metpoid"
let strCookie=document.cookie;
console.log(strCookie); // userId=9527;userName=Metpoid
--当然这个要在环境下运行,因为是获取当前域名下的 cookie。--
由此可见,只能够一次获取所有的 cookie 值,而不能指定 cookie 名称来获得指定的值,这正是处理cookie值最麻烦的一部分,用户必须自己分析这个字符串,来获取指定的 cookie 值,例如,要获取 userId 的值,可以这样实现:

document.cookie="userId=9527";
document.cookie="userName=Metpoid";
let strCookie=document.cookie
console.log(strCookie); // userId=9527;userName=Metpoid

function getdescookie(strcookie,matchcookie){
    let getMatchCookie;
    let arrCookie=strcookie.split(";");
    for(let i=0;i<arrCookie.length;i++){
        let arr=arrCookie[i].split("=");
        if(matchcookie == arr[0]){
            getMatchCookie = arr[1];
            break
        }
    }
    return getMatchCookie
}
let resultCookie = getdescookie(strCookie,"userId");
console.log(resultCookie);//9527

这样就可以得到单独的 cookie 的值。
如果在某个页面创建了一个 cookie,那么该页面所在目录的其他页面也可以访问该 cookie ,如果这个目录下还有子目录,则在子目录中也可以访问。
为了控制 cookie 可以访问的目录,需要使用 path 参数设置 cookie , 语法如下:
document.cookie="name=value;path=cookieDir";
其中 cookieDir 表示可访问 cookie 的目录。
例如:
document.cookie="userId=200;path=/shop";
就表示当前 cookie 仅能在 shop 目录下使用。
如果要使 cookie 在整个网站下可用,可以将 cookie_dir 指定为根目录,例如: document.cookie="userId=200;path=/";

cookie的常规操作延伸

addCookie

addCookie(name,value,expireHours)该函数接收3个参数:cookie名称,cookie值,以及在多少个小时后过期。说明下:这个expireHours 当然也可以设置成天或者秒等,只是在函数内部的处理稍微变一下而已:

function addCookie(name,value,expireHours){
    let exdate = new Date()
    exdate.setTime(exdate.getTime() + expireHours * 60 * 60 *1000);
    document.cookie = c_name + "=" + escape(value) + ((expireHours == null)?"":";expires=" + exdate.toUTCString())
}

getCookie

获取指定名称的 cookie 值:getCookie(name)。 该函数返回名称为 name 的 cookie 值,如果不存在则返回空,先来看下得到当前 cookie 的代码:

document.cookie="userId=9527";
document.cookie="userName=Metpoid";
console.log(document.cookie); // userId=9527; userName=Metpoid

看到得到的cookie 列表了吧,两个cookie之间用; 隔开后还有空格,所以用正则匹配获取当前指定的某个cookie名称的值,实现如下:

function getCookie(name){
    let arr;
    let reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
    if(arr=document.cookie.math(reg)){
        console.log(arr)
        return arr[2];
    }else{
        return null;
    }
}

上面的代码中在经过 getCookie('userName') 调用后,arr打印出来的值为:
[' userName=Metpoid', ' ', 'Metpoid', '', index: 12, input: 'userId=9527; userName=Metpoid']
如果全局匹配: reg = new RegExp("(^| )" + name + "([^;])(;|$)",'g');*
那么得到的 arr 数组为: ["userName=Metpoid"]
或者不用正则匹配,如下代码:

function getCookie(name){
    let strCookie=document.cookie;
    let arrCookie=strCookie.split(";");
    for(let i=0;i<arrCookie.length;i++){
        let arr = arrCookie[i].split("=");
        if(arr[0]==name){
            return arr[1]
        }
    }
    return null;
}

deleteCookie

删除指定名称的cookie:deleteCookie(name)。该函数可以删除指定名称的cookie,其实现如下:

function deleteCookie(name){
    let exp = new Date();
    exp.setTime(exp.getTime() - 1);
    document.cookie = name + "=v;expires=" + exp.toUTCString();
}

以上就是关于cookie的一些基本使用了,
可参考地址:w3school:JavaScript Cookies