姐们儿真的吃了很多次cookie的亏了,真的……这次来把它看看清楚
Cookie是什么
http是一个不保存状态的协议,什么是不保存状态,就是服务器不清楚是不是同一个浏览器(调用方)在访问它,而为了使服务器能够区分请求来自于谁,就需要记录状态,所以就有了cookie的出现。
cookie是什么,cookie就是一种浏览器管理状态的一个文件,它有name,也有value,后面那些看不见的是Domain、path等等,我们后面会介绍
Cookie原理
第一次访问网站的时候,浏览器发出请求,服务器响应请求后,会将cookie放入到响应请求中,在浏览器第二次发请求的时候,会把cookie带过去,服务端会辨别用户身份,当然服务器也可以修改cookie内容
Cookie跨域问题
这个坑正好被踩到了。
之前有一个需求是:在一个网页(源网页)中需要嵌入一个h5页面,而h5页面和的域名和源网页的四级域名是不一样(三级域名一样),在调用后台请求时,这两个页面都必须携带cookie以使得服务器能辨别用户身份。源网页可以通过调用登录接口让服务器下发代表用户身份的cookie,但h5是内嵌在源网页,且未实现登录功能的,所以这时就希望将源网页的cookie传递给h5,但两者域名又不一样,怎么传递呢?
这时就需要先搞懂cookie在浏览器的存储机制了。
cookie路径
cookie 一般都是由于用户访问页面而被创建的,可是并不是只有在创建 cookie 的页面才可以访问这个cookie。在默认情况下,出于安全方面的考虑,只有与创建 cookie 的页面处于同一个目录或在创建cookie页面的子目录下的网页才可以访问。那么此时如果希望其父级或者整个网页都能够使用cookie,就需要进行路径的设置。
path表示cookie所在的目录,asp.net默认为/,就是根目录。在同一个服务器上有目录如下:/test/,/test/cd/,/test/dd/,现设一个cookie1的path为/test/,cookie2的path为/test/cd/,那么test下的所有页面都可以访问到cookie1,而/test/和/test/dd/的子页面不能访问cookie2。这是因为cookie能让其path路径下的页面访问。
让这个设置的cookie 能被其他目录或者父级的目录访问的方法:
document.cookie = "name = value; path=/";
cookie域
domain表示的是cookie所在的域,默认为请求的地址,如网址为www.jb51.net/test/test.aspx,那么domain默认为www.jb51.net。而跨域访问,如域A为t1.test.com,域B为t2.test.com,那么在域A生产一个令域A和域B都能访问的cookie就要将该cookie的domain设置为.test.com;如果要在域A生产一个令域A不能访问而域B能访问的cookie就要将该cookie的domain设置为t2.test.com。
而针对上面提到的h5和源网页cookie共享的问题,服务器只需要在下发cookie的时候将cookie的domain设置为三级域名即可。
注:cookie包含name/value/domain/path/Max-Age/secure/HttpOnly等属性,若服务器在返回response的时候,设置了两个domain下name都为IOV_ACCOUNT_SESSIONID的cookie,那么浏览器在下次请求的时候,会将这两个cookie带到下次的请求中,而服务器此时无法区分哪个cookie来自哪个domain,会选择其中一个cookie识别,此时就有可能造成session id无效的问题。
关于cookie的属性详解,参考:https://juejin.im/post/59d1f59bf265da06700b0934