关于Session和Cookie的使用仿佛永远也剖析不完,这须要咱们在实际项目中灵活运用,以至将其各自的特定发挥到极致!今天再次拜读《Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版》中对Session和Cookie的讲解,感受很赞,下面摘抄内容共同提升! 数据库
关于Cookie 浏览器
浏览器会给每一个cookie加上一些附加信息:有效期、有效路径,以及适用的域名等。若是你给cookies[name]赋上一个值从而建立一个cookie,就会获得这些选项的默认值:cookie对整个网站有效、永不过时,而且适用于建立cookie的域名。固然,你也能够传入一个hash来覆盖这些默认值。 安全
可用的选项包括:domain、:expires、:path、:secure和:value。:domain和:path选项指定了cookie的有效范围——若是后续请求的地址位于cookie的有效域名中,而且路径又是位于cookie的有效路径下,那么浏览器就会把cookie发送给服务器。:expire选项设置了cookie的生命时间限制。:expire 选项的值能够是一个绝对时间,若是客户机时间超过该时间,浏览器就会将cookie删除;该选项的值也能够是一个空字符串,此时浏览器就只把cookie保存在内存中,在会话结束以后便将其删除。若是没有指定过时时间,cookie就是永久有效的。最后,:secure选项会告诉浏览器:只有当使用https://发送请求时,才能够将cookie发回服务器。 服务器
cookie很适合用于在浏览器上保存一些短小的字符串,但并不适于保存大量结构化的数据——你应该用session来保存这些东西。 cookie
对Cookie设置有效日期的推荐: expire 选项的值是一个绝对时间,当cookie建立时就会设置进去。若是须要指定cookie在用户的最后一次请求以后多少分钟过时,你可以在每次请求以后重设cookie,也能够——更好的办法是——把cookie过时时间保存在session数据中,而后在那里更新。 session
Cookie检测 数据结构
当用户禁用了Cookie后,咱们须要进行必定的检测,以便咱们能在不借助Cookie的状况下应用也一样可靠(即使不能实现所有功能,咱们也能保证不丢失或破坏数据。)
dom
关于Session 网站
和Cookie不一样,Session能够保存任意对象(只要对象能够序列化),所以很适宜保存WEB的状态信息。譬如说咱们能够把购物车对象保存在Session中(虽然前面咱们已经论证过这种方法有欠缺),这样就能够在屡次请求之间共享信息。
spa
注意事项:
(1)可以放入Session的对象是有限制的,这取决于你的存储机制(如:I/O对象就不能够放进去);
(2)最好不要在Session中存储大量数据,能够把他们放进数据库,而后在Session中引入这些数据,尤为是对基于Cookie的Session,由于它最多只能存储4KB。
(3)最好不要把常常变化的数据放入Session中。如统计Blog时想把统计结果放进Session,可是若是此时又有用户发表了blog,数据就不许确了;把用户信息放入Session也是个很诱人的解决方案。但若是你想经过后台能禁用某一用户,这种作法就不这么及时了!--即使你已经在数据库中禁用了这些用户,但他的Session仍然是“有效”的!
常常变化的数据应该放进数据库,而后从Session中引入这些数据。
(4)最好不要把关键信息单独放进Session。譬如,应用在一个请求中生成了一个订单肯定号,你想把他存入Session中,待用户提交后再存入数据库中。但这样并不安全,若是用户删除了浏览器的Cookie中的订单确如号就丢失了!因此,关键信息应该保存在数据库中,而后从session中引用这些数据。
还有一个问题是:若是把对象存储进Session中,只要同一浏览器再次访问,它就会视图访问此对象,但若是咱们在这一过程当中更改了这一对象,就会形成读取失败!解决这一问题的办法有三个:1)把对象保存在数据库中 ,只在Session中保存ID;2)若是改变了数据结构定义,就手工删除服务器端保存的全部Session数据;3)第三个办法就稍显复杂,咱们能够在Session键中加上版本号,若是更新了数据结构,就同时也更新版本号。这样咱们就能够只加载与当前版本匹配的数据。咱们还能够记录各类版本号,以即可以实现更细粒度的版本控制!
Session过时与清除
Session数据是保存在服务器上的,每一个新的会话都会向Session存储空间存储数据,服务器端的资源十分宝贵,因此咱们必须管理好这些空间,否则服务器空间将会被耗尽!从另外一个角度讲,应用并不须要Session永久有效,因此咱们须要经过设置失效时间或主动注销来销户Session!
参考:《Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版》P.353--P.363