当前位置: 代码迷 >> JavaScript >> 不同目录写cookie有关问题,解决立刻给分
  详细解决方案

不同目录写cookie有关问题,解决立刻给分

热度:36   发布时间:2012-08-03 00:12:14.0
不同目录写cookie问题,解决立刻给分
WEB站点根下有1个子目录FoldN/
现在我在站点根下写有cookie,如下:
document.cookie="myname=jjzzhhss; path=/"

在根下和目录FoldN/读myname都正常,都是myname=jjzzhhss;

在根下修改myname,读出来也正常

问题:
在目录FoldN/下修改myname后就出问题了,修改如下:
document.cookie="myname=aabbcc; path=/"

这时候,在根下读cookie时,值还是:
myname=jjzzhhss

然后,在FoldN/目录读cookie时,就变成了:
myname=jjzzhhss; myname=aabbcc

请教,如何使在FoldN/目录修改myname不会出现2个同名cookie?
请高手解答,解决测试成功,立刻送分!

------解决方案--------------------
同名的 cookie,不同的 domain 或不同的 path,属不同的 cookie; 
同名的 cookie,相同的 domain 且相同的 path,不同的 expires,属同一个 cookie
------解决方案--------------------
cookie 有路径--path,表示哪些路径下的文件有权限读取该 cookie。 

path 应该以 "/" 结尾,同名 cookie,不同 path,属不同的 cookie 

document.cookie = "N1=1; path=/path/"; 
document.cookie = "N1=2; path=/path"; 
document.cookie = "N1=3; path=path/"; 

如上代码,前两句使用的是绝对路径,即相对于站点根目录的网页目录,第三句使用的是相对路径,相对于当前目录的。 

第一句和第二句在于结尾不同,虽然他们所表达的权限相同,但是由于 path 字符串不同,会形成两个同名的 cookie,容易造成混乱,建议不要使用第二句这种格式,因为系统默认也是以 "/" 结尾的。 

所以如上述是三个 cookie,之间不会相互覆盖。
------解决方案--------------------
path 权限有继承性 

假如指定了 /test/ 目录有权限读取某 cookie,那么 /test/ 之下的目录 /test/t/ 也有权限读取该 cookie。 


cookie 有失效日期--expires,如果还没有过失效期,即使重新启动电脑,cookie 仍然不会丢失,如果没有指定 expires 值,那么在关闭浏览器时,cookie 即失效。 

在 JS(JavaScript) 中使用 expires 时应该和 cookie 同时写入,如: 
document.cookie = "clr=red; expires=" + expiresDate; 

而如下写法是不正确的: 
document.cookie = "clr=red"; 
document.cookie = "expires=" + expiresDate; 
这样写会形成两个 cookie,第二个 cookie 的名称是 expires,两个 cookie 均没有指定失效日期。 

expires 不可读 
这就是为什么,我们在 ASP 中使用 response.Write request.cookies("cname").expires 会出错,同样在 JS(JavaScript) 中使用 document.cookie 也不会显示出 expires。 

expires 值应该使用 GMT 格式的时间 
var the_date = new Date("December 31, 2020"); 
var expiresDate = the_date.toGMTString(); //转换成 GMT 格式。编者者: GMT 即格林威治标准时间,现在也称 UTC 即全球标准时间。 


------解决方案--------------------
你应该可以了解这些吧?
------解决方案--------------------
指定可访问cookie的路径
默认情况下,如果在某个页面创建了一个cookie,那么该页面所在目录中的其他页面也可以访问

该cookie。如果这个目录下还有子目录,则在子目录中也可以访问。例如在

www.xxxx.com/html/a.html中所创建的cookie,可以被www.xxxx.com/html/b.html或

www.xxx.com/ html/ some/c.html所访问,但不能被www.xxxx.com/d.html访问。
为了控制cookie可以访问的目录,需要使用path参数设置cookie,语法如下:
document.cookie="name=value; path=cookieDir";
其中cookieDir表示可访问cookie的目录。例如:
document.cookie="userId=320; path=/shop";
就表示当前cookie仅能在shop目录下使用。
如果要使cookie在整个网站下可用,可以将cookie_dir指定为根目录,例如:
document.cookie="userId=320; path=/";

------解决方案--------------------
我这没有变成2个啊
你抓图出来看下
------解决方案--------------------
汗!这就奇怪了!
我这只显示一个!
------解决方案--------------------
没有啊,我测试了几遍都没有你说的那情况
------解决方案--------------------
我想是不是你理解错误了
假如你一直刷新b.htm的话
那么显示的就都是在b.htm的cookie了
因为之前的已经被覆盖了啊
你用2个输出语句,他当然要输出2次了!
------解决方案--------------------
HTML code

<script>
function setCookie(name, value, expires, path, domain)
{
    if(!expires) expires = -1;
    if(!path) path = "/";
    var d = "" + name + "=" + value;

    var e;
    if (expires < 0) {
        e = "";
    }
    else if (expires == 0) {
        var f = new Date(1970, 1, 1);
        e = ";expires=" + f.toUTCString();
    }
    else {
        var now  = new Date();
        var f = new Date(now.getTime()  + expires * 1000);
        e = ";expires=" + f.toUTCString();
    }
    var dm;
    if(!domain){
        dm = "";
    }
    else{
        dm = ";domain=" + domain;
    }

    document.cookie = name + "=" + value + ";path=" + path + e + dm;
};

function getCookie(a)
{
    var b = String(document.cookie);
    var c = b.indexOf(a + "=");

    if (c != -1) {
        var d = b.indexOf(";", c);
        d = d == -1 ? b.length : d;
        c = c + a.length + 1;
        if(b.charAt(c)=='"'&&b.charAt(d-1)=='"'){
            c+=1;d-=1;
        }
        if(c>=d)
            return "";
        return b.substring(c, d);
    }

    return "";
};
//setCookie("good", "hel43lo", 365, "/", document.domain)
document.write(getCookie("good"));
//alert(document.domain);
//设置了path=/;应该就可以了。
</script> 
  相关解决方案