Cookie和Session

 Cookie和Session

这个写前端的时候用的较多,一般存放用户信息,登录状态等简单的信息。

Cookie

当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,

都纪录下来。当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie

里的内容来判断使用者,送出特定的网页内容给你。 Cookie 的使用很普遍,许多有提供个人化服务的网站,都是利用 Cookie

来辨认使用者,以方便送出使用者量身定做的内容,像是 Web 接口的免费 email 网站,都要用到 Cookie。

Cookie可存放的内容很小,可以设置过期时间,如果设置了,则浏览器会把Cookie存放在硬盘上,关闭后再次打开浏览器,或者浏览器打开多个相同站点的页面,Cookie都不会失效,直至到达过期时间,这种成为持久Cookie。

如果不设置过期时间,则只存放在内存中,在当前会话生命周期内有效,关闭浏览器后自动失效,这种成为会话Cookie。

那么最常见的场景就是,登录时问你是否保持登录状态,如果选是,就是持久Cookie,可以一周内都可以直接访问网站不用再次登录,选否,则是会话Cookie,下次打开网站还要登录。

不管是内存,还是硬盘上,都是在存放在客户端。

Session

用户与服务器建立连接时,服务器会给用户分发一个SessionID作为标识,这个ID在每次客户端和服务器交互时,都会包含在HTTP头中提交上去,是的,SessionID默认就是以Cookie方式存储的,也就是存放在客户端,存放方式同Cookie。

而服务器端的Session,直到失效时间才会失效,当关闭浏览器,或清空Cookie后,发现Session失效,其实并不是服务器端的Session失效了,而是SessionID没有了,导致服务器端也找不到对应的Session,所以像是,失效。

这里会引申出Session共享的问题,毕竟大公司不可能只有一台服务器,不同的服务器有不同的Web容器,那么下发的SessionID肯定不一样,如何让分发的服务器能够识别这个SessionID,那么就需要在不同服务器之间进行Session同步,

 

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

  该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。

Cookie和Session的区别:

  1.1 Cookie能存储的信息少,并且是存放在客户端,而Session只有SessionID存放在客户端,同时可以存更多的信息,具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

  1.2 Cookie只能存放字符串,而Session可以存放对象。

  1.3 Session安全性更高,但是会消耗服务器资源。

  1.4 Cookie的生命周期是累计的,从创建时,就开始计时,20分钟后,Cookie生命周期结束,Session的生命周期是间隔的,从创建时,开始计时如在20分钟,没有访问Session,那么Session生命周期被销毁,但是,如果在20分钟内(如在第19分钟时)访问过Session,那么,将重新计算Session的生命周期

  1.5 cookie可以跨2级域名,但是需要设置。

 

 

 

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

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

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

posted @ 2019-07-28 19:25  luytest  阅读(127)  评论(0编辑  收藏  举报