设置cookie遇到的坑

工作上需要给前端提供一个登录接口,通过sso验证。公司用的是CAS,找到一个现成的接口,接口传入用户的 domainname/username/password,可以返回相关的ticket。调用JS方法设置到cookie里

var Days = 30;
var exp = new Date();
exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
document.cookie = "CASTGC" + "=" + ticket + ";expires=" + exp.toGMTString();

再去访问接口时就会带上这个ticket。 自己本地写了一套js方法,在开发环境的登录页面测试,可以用接口登录。但是代码给了前端,前端本地的新页面跑不通,记录下解决过程中发现一堆坑。

1. F12看console, 发现request并没有把相关的ticket的传送过去。一度怀疑是这个页面是代理访问的,有跨域问题,想要把这个页面移到项目中再测试。但是旁边的大神肯定得指出,代理是系统成实现的,浏览器不知道这个代理的存在,同一个domain不同的子目录不可能一个跨域,一个不跨域。相比大神这种思路的上肯定,我的不坚定想法还是显得菜了点。

但是使用document.cookies的又是存在的。后面F12-application-Cookies 查看对比。发现cookies除了name\value 还有 Domain \ Path \Exipres 等属性。发现3个属性有3个问题:

1.我本地环境的Exipres是30天后,前端的Exipres是1961年。为何?

2.Domain属性,比如www.baidu.com, 某些情况下会变成前面多了一个点 ,如 .www.baidu.com

3.Path属性, 我环境的值是 /cas,访问的是/cas/login 路径, 前端环境的值也是/cas,但是访问的是/bar路径。

问题1:原因是前端用的ios,对javascript的new Date() 不支持“-”。 导致时间错乱

问题2:  见https://stackoverflow.com/questions/1062963/how-do-browser-cookie-domains-work

问题3:在js设置cookies的时候,指定path属性为“/”,即根目录,这样就在访问同domain不同子目时,也可以带上cookie了。 这里还有个小问题,我本地不用加空格,前端那里必须前面加空格

document.cookie = "CASTGC" + "=" + ticket + ";expires=" + exp.toGMTString()+";path=/";

另外对于expires,不用计算时间,直接 expires=Session;即可

猜你喜欢

转载自my.oschina.net/u/2382040/blog/1829714