• js中cookie的使用 以及缺点


     

      什么是Cookie

    Cookie意为“甜饼”,是W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。

    由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理

    Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

     

     

     Cookie机制

    在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

    而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。

    Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。

    JS设置cookie:

    假设在A页面中要保存变量username的值("jack")到cookie中,key值为name,则相应的JS代码为:

    document.cookie="name="+username;

     

     

    在cookie 的名或值中不能使用分号(;)、逗号(,)、等号(=)以及空格。在cookie的名中做到这点很容易,但要保存的值是不确定的。如何来存储这些值呢?方 法是用escape()函数进行编码,它能将一些特殊符号使用十六进制表示,例如空格将会编码为“20%”,从而可以存储于cookie值中,而且使用此 种方案还可以避免中文乱码的出现。

    document.cookie="str="+escape("I love ajax");  

    // document.cookie="str=I%20love%20ajax"; 

     

    当使用escape()编码后,在取出值以后需要使用unescape()进行解码才能得到原来的cookie值,

    JS读取cookie:

    假设cookie中存储的内容为:name=jack;password=123

    则在B页面中获取变量username的值的JS代码如下:

    var username=document.cookie.split(";")[0].split("=")[1];

    //JS操作cookies方法!

    //写cookies

    function setCookie(name,value)

    {

    var Days = 30;

    var exp = new Date();

    exp.setTime(exp.getTime() + Days*24*60*60*1000);

    document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();

    }

    读取cookies

     

    function getCookie(name)

    {

    var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");

    if(arr=document.cookie.match(reg))

    return unescape(arr[2]);

    else

    return null;

    }

     

    删除cookies

    function delCookie(name)

    {

    var exp = new Date();

    exp.setTime(exp.getTime() - 1);

    var cval=getCookie(name);

    if(cval!=null)

    document.cookie= name + "="+cval+";expires="+exp.toGMTString();

    }

    //使用示例

    setCookie("name","hayden");

    alert(getCookie("name"));

    //如果需要设定自定义过期时间

    //那么把上面的setCookie 函数换成下面两个函数就ok;

    //程序代码

    function setCookie(name,value,time)

    {

    var strsec = getsec(time);

    var exp = new Date();

    exp.setTime(exp.getTime() + strsec*1);

    document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();

    }

    function getsec(str)

    {

    alert(str);

    var str1=str.substring(1,str.length)*1;

    var str2=str.substring(0,1);

    if (str2=="s")

    {

    return str1*1000;

    }

    else if (str2=="h")

    {

    return str1*60*60*1000;

    }

    else if (str2=="d")

    {

    return str1*24*60*60*1000;

    }

    }

    //这是有设定过期时间的使用示例:

    //s20是代表20秒

    //h是指小时,如12小时则是:h12

    //d是天数,30天则:d30

    setCookie("name","hayden","s20");

     

     

    Cookie缺点

     

    cookie虽然在持久保存客户端数据提供了方便,分担了服务器存储的负担,但还是有很多局限性的。

    第一:每个特定的域名下最多生成20个cookie

     

    1.IE6或更低版本最多20个cookie

    2.IE7和之后的版本最后可以有50个cookie。

    3.Firefox最多50个cookie

    4.chrome和Safari没有做硬性限制

    IE和Opera 会清理近期最少使用的cookie,Firefox会随机清理cookie。

     

    cookie的最大大约为4096字节,为了兼容性,一般不能超过4095字节。

     

    IE 提供了一种存储可以持久化用户数据,叫做uerData,从IE5.0就开始支持。每个数据最多128K,每个域名下最多1M。这个持久化数据放在缓存中,如果缓存没有清理,那么会一直存在。

     

    优点:极高的扩展性和可用性

     

    1.通过良好的编程,控制保存在cookie中的session对象的大小。

    2.通过加密和安全传输技术(SSL),减少cookie被破解的可能性。

    3.只在cookie中存放不敏感数据,即使被盗也不会有重大损失。

    4.控制cookie的生命期,使之不会永远有效。偷盗者很可能拿到一个过期的cookie。

     

    缺点:

    1.`Cookie`数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。

     

    2.安全性问题。如果cookie被人拦截了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。

     

    3.有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。

  • 相关阅读:
    使用keepalived实现双机热备
    MYSQL ERROR CODE 错误编号的意义
    Mysql slow query log
    eclipse svn 分支合并到主干
    Timer的schedule和scheduleAtFixedRate方法的区别解析
    Java内部类引用外部类中的局部变量为何必须是final问题解析
    nginx中有关命令和日志切割,配置文件加载的详细阐述
    流媒体中ffmpeg 命令的使用
    windows下搭建nginx服务器及实现nginx支持https配置流程
    mysql 中sql语句的执行顺序
  • 原文地址:https://www.cnblogs.com/fly-xfa/p/6846429.html
Copyright © 2020-2023  润新知