写在前面的话: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的基本概念,对于解决一些更复杂的问题,也会变得比较容易。

(完)

文档信息

理解Session与Cookie的更多相关文章

  1. 转!!深入理解 Session 与 Cookie

    摘要 Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简 ...

  2. 深入理解Session与Cookie(一)

    Session,Cookie简介: Session和Cookie的作用都是为了保持用户与后端服务器的交互状态,但是各自都有缺陷: Cookie: 随着Cookie的个数的增多和访问量的增加,它占用的网 ...

  3. 深入理解 Session 与 Cookie

    Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...

  4. 【转】深入理解 Session 与 Cookie

    Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简单又复 ...

  5. [web]深入理解Session和Cookie

    一.理解Cookie 由于http是一种无状态的协议,当用户的一次访问结束后,后端的服务器就无法知道下一次来访问的请求是不是上一次的用户了.那么Cookie的作用就是用户通过http访问一个服务器时, ...

  6. 理解session和cookie

    Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...

  7. 第10章 深入理解Session与Cookie

    需要很多Cookie时,考虑HTTP对Cookie数量和大小的限制. 几百或更多台服务器的时候,如何解决Session在多态服务器之间共享的问题. 还有一些安全问题,如Cookie被盗,Cookie伪 ...

  8. 深入理解Session和Cookie机制

    具体来说cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力. 而 ...

  9. 第十章 深入理解Session与Cookie

    理解Cookie 理解Session Cookie安全问题 分布式Session框架 Cookie压缩 表单重复提交问题 多终端Session统一

随机推荐

  1. 在离线环境中使用.NET Core

    在离线环境中使用.NET Core 0x00 写在开始 很早开始就对.NET Core比较关注,一改微软之前给人的印象,变得轻量.开源.跨平台.最近打算试着在工作中使用.但工作是在与互联网完全隔离的网 ...

  2. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑

    自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...

  3. UWP开发必备以及常用知识点总结

    一直在学UWP,一直在写Code,自己到达了什么水平?还有多少东西需要学习才能独挡一面?我想对刚接触UWP的开发者都有这种困惑,偶尔停下来总结分析一下还是很有收获的! 以下内容是自己开发中经常遇到的一 ...

  4. php报错 ----> Call to undefined function imagecreatetruecolor()

    刚才在写验证码的时候,发现报错,然后排查分析了一下,原来是所用的php版本(PHP/5.3.13)没有开启此扩展功能. 进入php.ini 找到extension=php_gd2.dll ,将其前面的 ...

  5. TFS 测试用例步骤数据统计

    TFS系统集成了一套BI系统,基于SQL Server的Analysis Service进行实现的.通过这几年的深入使用,能够感触到这个数据数据仓库模型是多么的优秀,和微软官方提供的数据仓库示例Adv ...

  6. 代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

    坏味道--狎昵关系(Inappropriate Intimacy) 特征 一个类大量使用另一个类的内部字段和方法. 问题原因 类和类之间应该尽量少的感知彼此(减少耦合).这样的类更容易维护和复用. 解 ...

  7. C# 实时折线图,波形图

    此Demo是采用VS自带的Chart图表控件,制作实时动态显示的折线图,和波形图. 涉及到知识如下: Chart 控件,功能强大,可以绘制柱状图,折线图,波形图,饼状图,大大简化了对图的开发与定制. ...

  8. [算法]——归并排序(Merge Sort)

    归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...

  9. QT内省机制、自定义Model、数据库

    本文将介绍自定义Model过程中数据库数据源的获取方法,我使用过以下三种方式获取数据库数据源: 创建 存储对应数据库所有字段的 结构体,将结构体置于容器中返回,然后根据索引值(QModelIndex) ...

  10. 信息安全-2:python之hill密码算法[原创]

    转发注明出处:http://www.cnblogs.com/0zcl/p/6106513.html 前言: hill密码算法我打算简要介绍就好,加密矩阵我用教材上的3*3矩阵,只做了加密,解密没有做, ...