session 生命周期,cookie详解

 Session存储在服务器端,通常为了防止在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时建立,须要注意只有访问JSP、Servlet等程序时才会建立Session,只访问HTML、IMAGE等静态资源并不会建立Session,可调用request.getSession(true)强制生成Session。php

  Session何时失效?浏览器

  1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。安全

  2. 调用Session的invalidate方法。服务器

  Session对浏览器的要求:cookie

  虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然须要客户端浏览器的支持。这是由于Session须要使用Cookie做为识别标志。HTTP协议是无状态的,Session不能依据HTTP链接来判断是否为同一客户,所以服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。session

该Cookie为服务器自动生成的,它的maxAge属性通常为-1,表示仅当前浏览器内有效,而且各浏览器窗口间不共享,关闭浏览器就会失效。所以同一机器的两个浏览器窗口访问服务器时,会生成两个不一样的Session。可是由浏览器窗口内的连接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,所以会共享一个Session。并发

 注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在连接上右击,在弹出的快捷菜单中选择"在新窗口中打开"时,子窗口即可以访问父窗口的Session。工具

 若是客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另外一种解决方案:URL地址重写。网站

  URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器可以解析重写后的URL获取Session的id。这样即便客户端不支持Cookie,也可使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。若是客户端支持Cookie,会将URL原封不动地输出来。若是客户端不支持Cookie,则会将用户Session的id重写到URL中。搜索引擎

  注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,可是因为第一次请求时不会携带任何Cookie(由于并没有任何Cookie能够携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,所以URL地址重写后的地址中就不会带有jsessionid了。

 

Cookie老是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。

内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过时时间,除非用户手工清理或到了过时时间,硬盘Cookie不会被删除,其存在时间是长期的。因此,按存在时间,可分为非持久Cookie和持久Cookie。

用途

由于HTTP协议是无状态的,即服务器不知道用户上一次作了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结账时,因为HTTP的无状态性,不经过额外的手段,服务器并不知道用户到底买了什么。 因此Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器能够设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另外一个页面,浏览器会把Cookie发送给服务器,因而服务器知道他以前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结账时,服务器读取发送来的Cookie就好了。

Cookie另外一个典型的应用是当登陆一个网站时,网站每每会请求用户输入用户名和密码,而且用户能够勾选“下次自动登陆”。若是勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登陆了。这正是由于前一次登陆时,服务器发送了包含登陆凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登陆时,(若是该Cookie还没有到期)浏览器会发送该Cookie,服务器验证凭据,因而没必要输入用户名和密码就让用户登陆了。

Cookie的缺陷

  1. cookie会被附加在每一个HTTP请求中,因此无形中增长了流量。

  2. 因为在HTTP请求中的cookie是明文传递的,因此安全性成问题。(除非用HTTPS

  3. Cookie的大小限制在4KB左右。对于复杂的存储需求来讲是不够用的。[2]

使用和禁用Cookies

用户能够改变浏览器的设置,以使用或者禁用Cookies。同时一些浏览器自带或安装开发者工具包容许用户查看,修改或删除特定网站的Cookies信息。

识别功能

若是在一台计算机中安装多个浏览器,每一个浏览器都会以独立的空间存放cookie。由于cookie中不但能够确认用户,还能包含计算机和浏览器的信息,因此一个用户用不一样的浏览器登陆或者用不一样的计算机登陆,都会获得不一样的cookie信息,另外一方面,对于在同一台计算机上使用同一浏览器的多用户群,cookie不会区分他们的身份,除非他们使用不一样的用户名登陆。

反对Cookies者

隐私,安全和广告

Cookies在某种程度上说已经严重危及用户的隐私安全。其中的一种方法是:一些公司的高层人员为了某种目的(譬如市场调研)而访问了从未去过的网站(经过搜索引擎查到的),而这些网站包含了一种叫作网页臭虫的图片,该图片透明,且只有一个象素大小(以便隐藏),它们的做用是将全部访问过此页面的计算机写入cookie。然后,电子商务网站将读取这些cookie信息,并寻找写入这些cookie的网站,随即发送包含了针对这个网站的相关产品广告的垃圾邮件给这些高级人员。

偷窃Cookies和脚本攻击

虽然cookies没有中计算机病毒那么危险,但它仍包含了一些敏感信息:用户名,计算机名,使用的浏览器和曾经访问的网站。用户不但愿这些内容泄漏出去,尤为是当其中还包含有私人信息的时候。

这并不是危言耸听,跨站点脚本Cross site scripting)能够达到此目的。在受到跨站点脚本攻击时,cookie盗贼和cookie毒药将窃取内容。一旦cookie落入攻击者手中,它将会重现其价值。

  • Cookie盗贼:搜集用户cookie并发给攻击者的黑客。攻击者将利用cookie信息经过合法手段进入用户账户。

  • Cookie投毒:通常认为,Cookie在储存和传回服务器期间没有被修改过,而攻击者会在cookie送回服务器以前对其进行修改,达到本身的目的。例如,在一个购物网站的cookie中包含了顾客应付的款项,攻击者将该值改小,达到少付款的目的。这就是cookie 投毒。

Cookies的替代品

鉴于cookie的局限和反对者的声音,有以下一些替代方法:

  • Brownie方案,是一项开放源代码工程,由SourceForge发起。Brownie曾被用以共享在不一样域中的接入,而cookies则被构想成单一域中的接入。这项方案已经中止开发。

  • P3P,用以让用户得到更多控制我的隐私权利的协议。在浏览网站时,它相似于cookie。

  • 在与服务器传输数据时,经过在地址后面添加惟一查询串,让服务器识别是否合法用户,也能够避免使用cookie。

相关文章
相关标签/搜索