做项目的时候遇到个问题就是:因为前台和后台是独立开的(但在同一域名下),前台登录后设置了cookie,然后直接跳到后台,在后台却无法获取到设置的cookie,导致后台退出时,无法清除cookie,前台还是登录的状态。
产生这个问题的原因是cookie的作用域问题,假如本地服务器下的/webapp下面有两个应用:webapp_a和webapp_b,
1)在webapp_a下面设置的cookie,在webapp_b下面获取不到,因为cookie的作用域默认是产生cookie的应用的路径。
2)若在webapp_a下面设置cookie的时候,增加一条cookie.setPath("/");或者cookie.setPath("/webapp_b/");
就可以在webapp_b下面获取到设置的cookie了。
3)cookie.setPath这个参数;是相对于应用服务器存放应用的文件夹的根目录而言的(比如服务器下面的webapp),因此cookie.setPath("/")之后,可以在webapp文件夹下的所有应用共享cookie,而cookie.setPath("/webapp_b/")是指应用设置的cookie只能在webapp_b应用下的获得,即便是产生这个cookie的webapp_a应用也不可以。
4)设置cookie.setPath("/webapp_b/jsp")或者cookie.setPath("/webapp_b/jsp/")的时候,只有在webapp_b/jsp文件夹下面可以获得cookie,在webapp_b下面但是在jsp文件夹外的都不能获得cookie。
5)设置cookie.setPath("/webapp_b");,是指在webapp_b下面才可以使用cookie,这样就不可以在产生cookie的应用webapp_a下面获取cookie了
6)有多条cookie.setPath("XXX");语句的时候,起作用的以最后一条为准。
所以解决方法就是:在设置cookie的时候加个path="/"上去。
具体代码:
//设置cookie时间以秒为单位
function setCookie(c_name,value,expireseconds){
var exdate=new Date();
exdate.setTime(exdate.getTime()+expireseconds * 1000);
document.cookie=c_name+ "=" +escape(value)+
((expireseconds==null) ? "" : ";expires="+exdate.toGMTString())+";path=/";
}
注意:设置完cookie后,删除的时候也应该相应的加上path参数,才能删除掉cookie
具体代码:
//删除cookie
function delCookie(key){
var date = new Date(); //获取当前时间
date.setTime(date.getTime()-10000); //将date设置为过去的时间
document.cookie = key + "=v; expires =" +date.toGMTString()+";path=/"; //设置cookie
}
获取cookie代码:
//获取cookie
function getCookie(c_name){
if (document.cookie.length>0){
c_start=document.cookie.indexOf(c_name + "=");
if (c_start!=-1){
c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(";",c_start);
if (c_end==-1){
c_end=document.cookie.length;
}
return unescape(document.cookie.substring(c_start,c_end));
}
}
return "";
}