写在前面的话: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. 03.SQLServer性能优化之---存储优化系列

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概  述:http://www.cnblogs.com/dunitian/p/60413 ...

  2. MIP改造常见问题二十问

    在MIP推出后,我们收到了很多站长的疑问和顾虑.我们将所有疑问和顾虑归纳为以下二十个问题,希望对大家理解 MIP 有帮助. 1.MIP 化后对其他搜索引擎抓取收录以及 SEO 的影响如何? 答:在原页 ...

  3. vmware里面的名词 vSphere、vCenter Server、ESXI、vSphere Client

    vmware里面的名词 vSphere.vCenter Server.ESXI.vSphere Client vSphere.vCenter Server.ESXI.vSphere Client VS ...

  4. ASP.NET Web API 跨域访问(CORS)

    一.客户端用JSONP请求数据 如果你想用JSONP来获得跨域的数据,WebAPI本身是不支持javascript的callback的,它返回的JSON是这样的: {"YourSignatu ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)

    系列目录 前言: WebAPI主要开放数据给手机APP,其他需要得知数据的系统,或者软件应用,所以移动端与系统的数据源往往是相通的. Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能, ...

  6. 算法与数据结构(十七) 基数排序(Swift 3.0版)

    前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...

  7. Java 为值传递而不是引用传递

    ——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...

  8. 为什么很多SaaS企业级产品都熬不过第一年

    因工作缘由,笔者与周边数位SaaS企业级应用的创始人.运营负责人有过深入接触,发现一个有趣的现象:刚起步时,蓝图远志.规划清晰,但是一路下来,却异常艰难,有些甚至熬不过第一年,就关门歇业. 2015年 ...

  9. win10上部署Hadoop-2.7.3——非Cygwin、非虚拟机

    开始接触Hadoop,听人说一般都是在Lunix下部署Hadoop,但是本人Lunix不是很了解,所以Google以下如何在Win10下安装Hadoop(之后再在Lunix下弄),找到不少文章,以下是 ...

  10. SQL Server存储过程

    创建于2016-12-24 16:12:19 存储过程 概念: 1.存储过程是在数据库管理系统中保存的.预先编译的.能实现某种功能的SQL程序,它是数据库应用中运用比较广泛的 一种数据对象. 2.存储 ...