前端入门:重学Cookie与Session( 二 )


Cookie在客户端是由浏览器来管理的,浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全 。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名,Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie 。
需要注意的是,用户登录网站 www.google.com 之后会发现访问 images.google.com 时登录信息仍然有效,二者虽然同属于Google,但是域名不一样,同样不能互相操作彼此的Cookie,这是因为Google做了特殊处理 。想让同一个一级域名下的两个二级域名能交互使用Cookie,需要设置Cookie的domain参数 。例如想所有 wsghawk.com 名下的二级域名都可以使用该Cookie,可以这么写:cookie.setDomain(".wsghawk.com"); 注意,domain参数必须以点(".")开始 。
4、Cookie的路径
domain属性决定允许访问Cookie的域名,而path属性决定允许访问Cookie的路径(ContextPath) 。例如,如果只允许/hawk/下的程序使用Cookie,可以这么写:cookie.setPath("/hawk/"); 设置为“/”时允许所有路径使用Cookie,path属性需要使用符号“/”结尾 。
Session一、Session的工作原理
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上 。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是Session 。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了 。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份 。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了 。
二、Session的机制
Session机制采用的是在服务器端保持状态的方案 。 当用户访问到一个服务器,服务器就要为该用户创建一个Session,在创建这个Session的时候,服务器首先检查这个用户发来的请求里是否包含了一个SessionId,如果包含了一个SessionId则说明之前该用户已经登陆过并为此用户创建过Session,那服务器就按照这个SessionId把这个Session在服务器的内存中查找出来(如果查找不到,就有可能为它新创建一个) 。如果客户端请求里不包含有SessionId,则为该客户端创建一个Session并生成一个与此Session相关的SessionId 。这个SessionId是一个唯一的、不重复的字符串,这个SessionId将被在本次响应中返回到客户端保存,而保存这个SessionId的正是Cookie 。 这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器 。

前端入门:重学Cookie与Session

文章插图
 
三、Session相关问题
1、Session的生命周期
之前我一直认为,一个浏览器窗口被打开是创建一个Session,而关闭浏览器窗口时该Session就会被删除,其实这是错误的! 实际上直到某服务器端程序调用 HttpServletRequest.getSession(true); 这样的语句时Session才被创建 。而除非程序通知服务器删除Session,否则Session会被服务器一直保留,直到Session的失效时间到了自动删除 。服务器是不知道浏览器是否被关闭的 。
之前会产生这种错觉的原因是:一般Session机制都使用Cookie来保存SessionId,而一旦关闭浏览器,SessionId就不存在了,再连接服务器时就找不到原来的Session了 。如果服务器设置的Cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的SessionId发送给服务器,则再次打开浏览器仍然能够找到原来的Session 。由于关闭浏览器不会导致Session被删除,迫使服务器为Seesion设置了一个失效时间,当距离客户端上一次使用Session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把Session删除以节省存储空间 。
一般情况下,Session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的Session也会被清空 。如果设置了Session的持久化特性,服务器就会把Session保存到硬盘上,当服务器进程重新启动或这些信息将能够被再次使用(Tomcat在shutdown前默认会自动将Session保存到指定的目录中,因此tomcat重新启动后,Session是可以继续使用的) 。
2、Session对浏览器的要求
SessionId为服务器自动生成的,它的maxAge属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效 。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session 。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外,这类子窗口会共享父窗口的Cookie,因此会共享一个Session 。注意:新开的浏览器窗口会生成新的Session,但子窗口除外,子窗口会共用父窗口的Session 。


推荐阅读