理解Session与Cookie
写在前面的话:Session和Cookie是非常有意思的两个概念,对于两者的管理可以处理的很复杂,但是无论如何,理解Session和Cookie的基本概念和发明初衷,对于问题的解决,大有裨益。
=====正文开始========
在web的世界里,客户端通过HTTP Request向服务器发送请求,服务器通过HTTP Response响应用户请求,可是由于HTTP协议是无状态的,导致客户端和服务器端每次就像喝了孟婆汤一样,彼此相忘,导致每一次客户端的HTTP Request,服务器端都会认为是一次新的请求。对于一些简单的业务逻辑,彼此相忘,互不记得,没什么大碍,可是有的时候,就需要服务器端记住客户端,保持客户端访问的连续状态,以便实现所需的业务逻辑,方便服务器端程序编写。(例如一个用户登陆进去购物网站,那么就需要服务器端记住该用户的状态,不至于方法每一页面都需要用户登陆),于是就出现了Cookie和Session用来解决这种问题。
1.Cookie
(1)当客户端第一次访问服务器,向服务器端发送HTTP Request,服务器端返回HTTP Response,在HTTP Response的Header中通过Set-Cookie来设置Cookie,以便在客户端保存信息,例如Set-Cookie的设置如下:
名称:UserName 内容:Nicaiwoshishui 域: cnblogs.com 脚本可访问: 是 创建时间: 2015年2月16日星期一下午3:: 过期时间: 2015年8月17日星期一下午3::
(2)客户端(如浏览器)在收到服务器端HTTP Response后,看到了Set-Cookie的设置,那么就会在客户端电脑浏览器相应的目录生成该Cookie文件。对于IE浏览器来说,每一个域名的Cookie的内容保存成一个文件名为XXX.txt的文件,对于Chrome浏览器来说,所有的Cookie内容都写入一个文件;不过这不是关键,我们只需知道浏览器将Cookie内容保存下来了。

(3)当客户端第二次访问服务器时,向服务器发送HTTP Request,在HTTP Request的Header中,会包含上面的Cookie信息,这样在服务器端收到HTTP Request后,就知道是谁在访问了。
(4)以后的每次向服务器的HTTP Request,Header中都会包含该Cookie信息,直到过期时间到了为止。
(5)Cookie的存在大大方便了我们的操作,我们可以存入任意我们需要的信息,但是Cookie的内容会随着HTTP Request在header中传送,不宜过大。往往浏览器都会限制Cookie的大小和数目,同时也可以对Cookie内容进行压缩再进行传送。
2.Session
Cookie的内容是保存在客户端,我们也可以把数据保存在服务器端,这就是Session。Session有会话的意思,需要与Cookie的配合才能起作用。
(1)当客户端第一次访问服务器,向服务器端发送HTTP Request,服务器收到HTTP Request,如果在服务器端代码中启动Session设置,那么会生成一个唯一的SessionID,例如SessionID为:hu3g8fckjbk584qp2jn941vho5,之后服务器端会为以该SessionID为名生成Session文件,保存在服务器文件中,例如在服务器端生成文件名为sess_hu3g8fckjbk584qp2jn941vho5的文件;有时也会保存在内存中,生成与SessID相对应的对象;有时也可以保存在数据库中;无论保存在哪里,可以说生成了一个唯一SessionID的Session,之后我们就可以设置Session的内容了,例如Session['UserName']='nicaiwoshishui'。

(2)服务器端通过唯一的SessionID保存了用户的信息,在返回的HTTP Response中,仍然会有Set-Cookie的设置,不过现在不再需要把用户名保存在Cookie中,而是将SessionID保存在Cookie中,同样也会设置Cookie的过期时间等等信息,由于该Cookie保存的是SessionID的信息,因此也称为SessionCookie。有时我们启动Session后,并不需要我们手动的设置Cookie,web server会自动帮我们在HTTP Response的header中增加Set-Cookie的设置。
(3)当客户第二次访问服务器,发送的HTTP Request的Header中会含有该Cookie信息,服务器端收到Cookie信息后就能从中找到SessionID,进而可以找到服务器端内保存的该SessionID的Session了,无论是从内存中、文件中、数据库中,甚至是分布式环境中。
(4)Session可以设置有效期,如果在有效期内,一直没有客户端访问,那么到有效期过后,用户访问服务器后,需要重新设置Session;对于需要登录的网站,会提示会话过期,请重新登录。
(5)SessionCookie也有有效期,一般默认的是关闭浏览器后就过期,因此关闭浏览器后如果在访问之前登录的网站,会提示会话过期,请重新登录。这里注意,虽然关闭浏览器后,客户端的SessionCookie就被删除了,但是如果服务器端的Session还没有过期,那么服务器端的Session信息仍然会被保留;由于SessionCookie被删除了,无法在HTTP Request的Header中传送SessionID,因此也就无法再识别该用户了。
(6)如果使用浏览器A访问服务器端,服务器端设置的SessionID为SessionID1,使用浏览器B访问服务器端,服务器设置的SessionID为SessionID2,那么SessionID1与SessionID2不同,其中使用浏览器A的用户设置的所有Session值,如Session['userName']值会保存在SessionID1中,而使用浏览器B的用户设置的所有Session值,保存在SessionID2中,两者互相不干扰。
(7)Session需要与SessionCookie配合才能够很好工作,如果客户端禁用Cookie后,那么Session机制就会失效,具体体现就是用户在浏览器中访问很多网站访问不了。
(8)为了使禁用Cookie的用户能够正常访问服务器端网站,可以通过一种URL Rewriting的方法,解决Session机制失效的问题。
理解了Session和Cookie的基本概念,对于解决一些更复杂的问题,也会变得比较容易。
(完)
文档信息
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
- 本文为原创文章,欢迎转载,后续本博客会不断更新,因此请保留该文档信息。
- 本文地址:http://www.cnblogs.com/wuguanglei/p/4294251.html
理解Session与Cookie的更多相关文章
- 转!!深入理解 Session 与 Cookie
摘要 Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简 ...
- 深入理解Session与Cookie(一)
Session,Cookie简介: Session和Cookie的作用都是为了保持用户与后端服务器的交互状态,但是各自都有缺陷: Cookie: 随着Cookie的个数的增多和访问量的增加,它占用的网 ...
- 深入理解 Session 与 Cookie
Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...
- 【转】深入理解 Session 与 Cookie
Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简单又复 ...
- [web]深入理解Session和Cookie
一.理解Cookie 由于http是一种无状态的协议,当用户的一次访问结束后,后端的服务器就无法知道下一次来访问的请求是不是上一次的用户了.那么Cookie的作用就是用户通过http访问一个服务器时, ...
- 理解session和cookie
Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...
- 第10章 深入理解Session与Cookie
需要很多Cookie时,考虑HTTP对Cookie数量和大小的限制. 几百或更多台服务器的时候,如何解决Session在多态服务器之间共享的问题. 还有一些安全问题,如Cookie被盗,Cookie伪 ...
- 深入理解Session和Cookie机制
具体来说cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力. 而 ...
- 第十章 深入理解Session与Cookie
理解Cookie 理解Session Cookie安全问题 分布式Session框架 Cookie压缩 表单重复提交问题 多终端Session统一
随机推荐
- H5坦克大战之【建造敌人的坦克】
公司这几天在准备新版本的上线,今天才忙里偷闲来写这篇博客.接着上一篇的"H5坦克大战之[玩家控制坦克移动2]"(http://www.cnblogs.com/zhouhuan/ ...
- tLinux 2.2下安装Mono 4.8
Tlinux2.2发行版基于CentOS 7.2.1511研发而成,内核版本与Tlinux2.0发行版保持完全一致,更加稳定,并保持对Tlinux2.0的完全兼容.Mono 4版本要求CentOS 7 ...
- Hyper-V2:向VM增加虚拟硬盘
使用Hyper-V创建VM,在VM成功安装OS之后,发现VM只有一个逻辑盘C,用于存储VM的操作系统.在产品环境中,需要向VM增加虚拟硬盘,便于将数据单独存储在不同的逻辑盘符中.在Hyper-V中,分 ...
- Android -- 真正的 高仿微信 打开网页的进度条效果
(本博客为原创,http://www.cnblogs.com/linguanh/) 目录: 一,为什么说是真正的高仿? 二,为什么要搞缓慢效果? 三,我的实现思路 四,代码,内含注释 五,使用方法与截 ...
- 我这么玩Web Api(一):帮助页面或用户手册(Microsoft and Swashbuckle Help Page)
前言 你需要为客户编写Api调用手册?你需要测试你的Api接口?你需要和前端进行接口对接?那么这篇文章应该可以帮到你.本文将介绍创建Web Api 帮助文档页面的两种方式,Microsoft Help ...
- C#——传值参数(1)
//我的C#是跟着猛哥(刘铁猛)(算是我的正式老师)<C#语言入门详解>学习的,微信上猛哥也给我讲解了一些不懂得地方,对于我来说简直是一笔巨额财富,难得良师! 这次与大家一起学习C#中的值 ...
- 多线程 异步 beginInvoke EndInvoke 使用
有许多耗时操作时,还要响应用户操作.这时候就需要用其他线程或者异步来搞.本来是改造公司的日志组件.因为多上了个国外大区的业务到来本系统来.这个系统其他地方都好就是日志,动不动就要死给我们看.有时候寻找 ...
- css样式之超出隐藏
文本超出部分隐藏,总结两种方法. 1.单行隐藏 html代码 <div class="mi">当文字超过范围的时候,超出部分会隐藏起来.</div> css ...
- HA 高可用软件系统保养指南
又过了一年 618,六月是公司一年一度的大促月,一般提前一个月各系统就会减少需求和功能的开发,转而更多去关注系统可用性.稳定性和管控性等方面的非功能需求.大促前的准备工作一般叫作「备战」,可以把线上运 ...
- python selenium
https://segmentfault.com/a/1190000007249396?_ea=1293878