1. Cookie说明

cookie 就是浏览器储存在用户电脑上的一小段文本文件。cookie 是纯文本格式,不包含任何可执行的代码。一个 Web 页面或服务器告知浏览器按照一定规范来储存这些信息,并在随后的请求中将这些信息发送至服务器,Web 服务器就可以使用这些信息来识别不同的用户。大多数需要登录的网站在用户验证成功之后都会设置一个 cookie,只要这个 cookie 存在并可以,用户就可以自由浏览这个网站的任意页面。再次说明,cookie 只包含数据,就其本身而言并不有害。

2. Cookie和Session区别

2.1 存取方式的不同

Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。
Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。

2.2 隐私策略的不同

Cookie存储在客户端阅读器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。

2.3 有效期上的不同

使用过Google的人都晓得,假如登录过Google,则Google的登录信息长期有效。用户不用每次访问都重新登录,Google会持久地记载该用户的登录信息。要到达这种效果,运用Cookie会是比较好的选择。只需要设置Cookie的过期时间属性为一个很大很大的数字。
由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了阅读器该Session就会失效,因而Session不能完成信息永世有效的效果。运用URL地址重写也不能完成。而且假如设置Session的超时时间过长,服务器累计的Session就会越多,越容易招致内存溢出。

2.4 服务器压力的不同

Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。因而像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。
而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。关于Google、Baidu、Sina来说,Cookie或许是唯一的选择。

2.5 浏览器支持的不同

Cookie是需要客户端浏览器支持的。假如客户端禁用了Cookie,或者不支持Cookie,则会话跟踪会失效。关于WAP上的应用,常规的Cookie就派不上用场了。
假如客户端浏览器不支持Cookie,需要运用Session以及URL地址重写。需要注意的是一切的用到Session程序的URL都要进行URL地址重写,否则Session会话跟踪还会失效。关于WAP应用来说,Session+URL地址重写或许是它唯一的选择。
假如客户端支持Cookie,则Cookie既能够设为本浏览器窗口以及子窗口内有效(把过期时间设为–1),也能够设为一切阅读器窗口内有效(把过期时间设为某个大于0的整数)。但Session只能在本阅读器窗口以及其子窗口内有效。假如两个浏览器窗口互不相干,它们将运用两个不同的Session。(IE8下不同窗口Session相干)

2.6 跨域支持上的不同

Cookie支持跨域名访问,例如将domain属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中,例如Google、Baidu、Sina等。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。
仅运用Cookie或者仅运用Session可能完成不了理想的效果。这时应该尝试一下同时运用Cookie与Session。Cookie与Session的搭配运用在实践项目中会完成很多意想不到的效果。

3. 设置和删除Cookie

Cookie: name value expires path domain

1
2
3
4
5
6
例如:
name: u
value: 2dc4669582909ad73607467e17cf76322263e681965f037a2e8611e59e3c8038bc0bb13d5a8b761d
expires: 2018-02-20T01:12:52.000Z
path:/
domain: .dahao.de

3.2 PHP

1
2
setcookie('u', 'value', 7, '/wechat/', '.dahao.de');
setcookie('u', '', time()-3600, '/wechat/', '.dahao.de');

3.3 JQuery

引入 Jquery 插件后,写法:

1
2
3
4
5
6
7
$.cookie("u", data.token,{
"expires": 30,
"path": "/xiaoshuo/",
"domain": ".dahao.de"
});
$.removeCookie('u', {path: '/xiaoshuo/', domain: '.dahao.de'});

4.Cookie匹配原则

当访问网站时,首先匹配当前网址域是否和cookie中 domain匹配,然后根据当前网址路径来匹配path。
根据这次做小说微信公众号帐号互通来分析:

  1. Cookie 名称一致,导致互动小说大全和小说微信公众号读取最先登录的用户信息
  2. Cookie 未独立设置 path
  3. Cookie 匹配规则先后顺序错误,在后端PHP对Cookie匹配是先匹配 u 然后才是 xs-u
    这样导致小说微信公众号即使使用独有的名称并设置path,也会出现帐号互通情况。

5. 总结

Cookie 当只存在一个域名一个路径时,可能这些情况都不会出现,但是自己没有考虑到一些特殊情况,所以合理设置 Cookie 可以从功能上面可以避免很多问题。