什么是Cookie?

Cookie是Web服务器在用户访问Internet站点时传递到Web浏览器的消息。浏览器会将每条消息以名称 – 值对的形式存储在用户计算机上的一个小文件中。当用户从服务器请求另一个页面时,浏览器会将cookie发送回服务器。这些文件通常包含有关用户访问网页的信息,以及用户自愿提供的任何信息,例如:用户信息,用户首选项,密码记住选项等。

使用Cookie的优点

1、Cookie易于使用和实现

实现cookie的使用要比任何其他Internet协议容易得多。

2、占用更少的内存

不需要任何服务器资源,并存储在用户的计算机上,因此不会给服务器带来额外的负担。

3、持久性

Cookie最强大的一个方面就是持久性。当在客户端的浏览器上设置Cookie时,它可以持续数天,数月甚至数年。这样可以轻松保存用户首选项和访问信息,并在用户每次返回站点时保持此信息可用。此外,由于Cookie存储在客户端的硬盘上,因此如果服务器崩溃,它们仍然可用。

4、 透明性

Cookie透明地工作,用户不知道需要存储的信息。

5、易于管理

大多数浏览器都可以让用户轻松清除浏览历史记录。只需转到工具,清除历史记录并选择Cookie即可。

Cookie存储在用户硬盘驱动器上的cookie.txt下的文本文件中,因为它是一个文本文件,我们可以使用任何查看器或文本编辑器来显示,编辑和删除它们。

使用Cookie的缺点

1、隐私问题

大多数用户主要关心的是隐私。启用Cookie的Web浏览器会跟踪您访问过的所有网站。这意味着,经许可(或不在Google的情况下),第三方可以访问这些cookie存储的信息。在某些情况下,这些第三方可以是广告商,其他用户。。。。

2、不安全

Cookie安全性是一个大问题,因为它们是以明文形式存储,可能会造成安全风险,因为任何人都可以打开并篡改cookie。

Cookie容易在客户端被发现意味着它们很容易被黑客入侵和修改。

3、难以解密

我们可以手动加密和解密cookie,但由于加密和解密所需的时间,它需要额外的编码并影响应用程序性能。

4、大小有限制,只能储存简单字符串信息

cookie文本的大小(一般为4kb),cookie的数量(一般每个站点20个)存在一些限制,每个站点只能容纳20个cookie。

Cookie仅限于简单的字符串信息,他们无法存储复杂的信息。

5、可以被禁用

用户可以选择从浏览器设置中禁用其计算机上的cookie。这意味着用户可以决定不在他的浏览器上使用cookie,这可能会在浏览器的运行中产生一些问题。

6、可以被删除

用户可以从其计算机中删除cookie,这使他们可以更好地控制cookie。

cookie自身是document对象的一个属性
使用:document.cookie

cookie的规则:要设置的cookie
        document.cookie = 要设置的cookie
        1.必须是字符:""
        2.字符内的格式要求:名=值,如:"user=admin"
        3.一条代码只能设置一条cookie
        4.设置cookie时,可以配置信息要求
            有效期:"expires=日期对象"
            路径:"path=/page"
        5.cookie的内容和每个配置信息之间用:";"连接
    
    设置cookie的语法:
        默认cookie
        document.cookie = "user=admin";

        设置具有有效期的cookie(3天之后)
        var d = new Date();
        d.getDate();获取当前当月天数
        d.setDate(d.getDate() + 3); //获取指定日期
        document.cookie = "abc=123;expires="+d;
        
        设置具有路径的cookie(3天之后)
        document.cookie = "abc=123;path=/page";

        设置具有路径和有效期的cookie(3天之后)
        var d = new Date();
        d.setDate(d.getDate() + 3);
        document.cookie = "abc=123;path=/page;expires="+d;

        删除cookie:通过有效期,让这个cookie过期,怎么能过期?当前设置曾经的日期。

    查cookie:
        var str = document.cookie
        str



cookie工作场景:
    cookie自身其实对工作环境没有要求
    但是cookie会随着http发往服务器
    使用cookie的时候,是不是需要记录客户端和服务器之间的信息
    客户端是浏览器,服务器是本地服务器
    所以导致,cookie最好也在服务器环境中使用

1.cookie-function

<script type="text/javascript">
	 // localStorage方法
	    // localStorage.setItem("user","admin");
	    // localStorage.getItem("user");
	    // localStorage.removeItem("user");
	
	
	    // 封装
	
	    // 假设将来的cookie的使用方式为:
	    // // 设置一个默认的cookie
	    // setCookie("qwe","123");
	    // setCookie("asd","234",{});
	    
	    // // 设置一个有有效期的cookie
	    // setCookie("zxc","345",{
	    //     expires:5
	    // });
	    
	    // // 设置一个有路径的cookie
	    // setCookie("abc","456",{
	    //     path:"/"
	    // });
	    
	    // // 设置一个既有有效期又有路径的cookie
	    // setCookie("hahaha","789",{
	    //     expires:3,
	    //     path:"/"
	    // });
	
	    // 设置cookie(可以实现修改)
	    function setCookie(key,val,ops){
	        // ops有可能为的值:
	            // undefined
	            // {}
	            // {expires:3}
	            // {path:"/"}
	            // {expires:3,path:"/"}
	        // 处理的是为undefined时
	        ops = ops || {};
	        // 处理有效期
	        let e = "";
	        if(ops.expires){
	            var d = new Date();
	            d.setDate( d.getDate() + ops.expires );
	            e = ";expires="+d;
	        }
	        // 处理路径
	        // let p = "";
	        // if(ops.path){
	        //     p = ";path="+ops.path;
	        // }
	        let p = ops.path ? ";path="+ops.path : "";
	        document.cookie = `${key}=${val}${p}${e}`;
	    }
	
	    
	    // console.log(getCookie("qwe"));
	    // console.log(getCookie("abc"));
	    // console.log(getCookie("user"));
	
	    function getCookie(key){
	        // 1.获取所有cookie
	        let strC = document.cookie;
	        // 2.使用"; "分割所有cookie,单独拿到每一条
	        let arrC = strC.split("; ");
	        // 3.遍历每一条cookie
	        for(var i=0;i<arrC.length;i++){
	            // 4.再次使用"="分割,分割成名字和值独立的状态
	            // 5.判断数组的第一位的名字是否与传进来要获取的cookie的名字一致
	            if(arrC[i].split("=")[0] === key){
	                // 6.如果一致,返回数组的第二位,也就是对应的值
	                return arrC[i].split("=")[1];
	            }
	        }
	        // 7.循环结束后,如果程序还在执行,说明没有找到一致的值,那就返回空字符
	        return "";
	    }
	
	    // 删除cookie
	    removeCookie("abc",{
	        path:"/"
	    });
	
	    // 删除cookie
	    function removeCookie(key,ops){
	        // 1.保证ops是个对象
	        ops = ops || {};
	        // 2.ops是对象了,无论如何得有个expires的属性为-1
	        ops.expires = -1;
	        // 3.将处理好的ops,给setCookie
	        setCookie(key,"suibianxie,danshibunengshenglue",ops);
	    }

</script>

2.cookie-test

封装cookie
 设置cookie
 function setCookie(key, value, indate) {
 const time = +new Date() - 8 * 3600 * 1000 + indate * 1000;
 document.cookie = ${key}=${value};expires=${time};
 }
 获取cookie
 function getCookie(key) {
 const cookieArr = document.cookie.split(’;’)
 let value = ‘’;
 cookieArr.forEach(item => {
 if (item.split(’=’)[0] === key) {
 value = item.split(’=’)[1]
 }
 })
 return value
 }
 删除cookie
 function delCookie(key) {
 setCookie(key, “”, -1);