cookies与session的区别

HTTP协议是无状态的协议,因此服务端须要记录用户的状态时,就须要用某种机制来识具体的用户,这个机制就是Session。html

       当程序须要为某个客户端的请求建立一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,若是已包含一个session id则说明之前已经为此客户端建立过session,服务器就按照session id把这个 session检索出来使用(若是检索不到,可能会新建一个),若是客户端请求不包含session id,则为此客户端建立一个session而且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。web

    在谈论session机制的时候,经常听到这样一种误解“只要关闭浏览器,session就消失了”。其实能够想象一下会员卡的例子,除非顾客主动对店家提出销卡,不然店家绝对不会轻易删除顾客的资料。对session来讲也是同样的,除非程序通知服务器删除一个session,不然服务器会一直保留,程序通常都是在用户作log off的时候发个指令去删除session。然而浏览器历来不会主动在关闭以前通知服务器它将要关闭,所以服务器根本不会有机会知道浏览器已经关闭,之因此会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次链接服务器时也就没法找到原来的session。若是服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然可以找到原来的session。算法

 

    偏偏是因为关闭浏览器不会致使session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就能够认为客户端已经中止了活动,才会把session删除以节省存储空间。数据库

    你们都知道,http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,并且服务器也不会自动维护客户的上下文信息,那么要怎么才能实现网上商店中的购物车呢,session就是一种保存上下文信息的机制,它是针对每个用户的,变量的值保存在服务器端,经过SessionID来区分不一样的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,咱们叫作session cookie,以区别persistent cookies,也就是咱们一般所说的cookie,注意session cookie是存储于浏览器内存中的,并非写到硬盘上的,这也就是咱们刚才看到的JSESSIONID,咱们一般情是看不到JSESSIONID的,可是当咱们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,咱们就能够在地址栏看到sessionid=KWJHUG6JJM65HS2K6之类的字符串。数组

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

而session机制采用的是一种在客户端与服务器之间保持状态的解决方案。同时咱们也看到,因为采用服务器端保持状态的方案在客户端也须要保存一个标识,因此session机制可能须要借助于cookie机制来达到保存标识的目的。而session提供了方便管理全局变量的方式安全

session是针对每个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪一个用户session变量,这个值是经过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。服务器

    就安全性来讲:当你访问一个使用session 的站点,同时在本身机子上创建一个cookie,建议在服务器端的SESSION机制更安全些.由于它不会任意读取客户存储的信息。cookie

    正统的cookie分发是经过扩展HTTP协议来实现的,服务器经过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie网络

    从网络服务器观点看全部HTTP请求都独立于先前请求。就是说每个HTTP响应彻底依赖于相应请求中包含的信息

    状态管理机制克服了HTTP的一些限制并容许网络客户端及服务器端维护请求间的关系。在这种关系维持的期间叫作会话(session)。

    Cookies是服务器在本地机器上存储的小段文本并随每个请求发送至同一个服务器。

  明白了原理,咱们就能够很容易的分辨出persistent cookies和session cookie的区别了,网上那些关于二者安全性的讨论也就一目了然了,session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本(一般是加密的),并且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,天然不如session cookie安全了。

一般session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的sessionid,这样咱们信息共享的目的就达不到了,此时咱们能够先把sessionid保存在persistent cookie中,而后在新窗口中读出来,就能够获得上一个窗口SessionID了,这样经过session cookie和persistent cookie的结合咱们就实现了跨窗口的session tracking(会话跟踪)。

    在一些web开发的书中,每每只是简单的把Session和cookie做为两种并列的http传送信息的方式,session cookies位于服务器端,persistent cookie位于客户端,但是session又是以cookie为基础的,明白的二者之间的联系和区别,咱们就不难选择合适的技术来开发web service了

 

cookies和session的关系1。 Cookie是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上, 

能够用来在某个Web站点会话之间持久地保持数据。Request和Response对象都有 

一组Cookie。Request.cookie集合是一系列Cookie,从客户端与HTTP Request一 

起发送到Web服务器。反过来,若是你但愿把Cookie发送到客户机,就可使用R 

esponse.cookie 
一、ExpiresAbsolute属性 
该属性能够赋一个日期,过了这个日期Cookie就不能再被使用了。经过给Ex 

pires属性赋一个过时的日期,就能够删除Cookie。如: 
<%Response.cookies("passtime").expiresAbsolute="1/1/99"%> 
二、Domain属性 
该属性定义Cookie要传送的惟一域。如:Cookie只传送给Microsoft的人, 

则可使用如下代码。 
<%Response.Cookies("domain").Domain="www.microsoft.com"%> 三、ASP用来写入Cookie即向客户机发送Cookie的语法以下: Response.Cookie("Cookie名").[("键名").属性]=内容 若是某个ASP文件要建立一个Cookie,则下面的代码能够放在ASP文件的第一 个<html>以前,以免产生错误. <%Response.Cookies("CookieName")="NewCookie" %> <html> ...... </html> 四、一样ASP用Request对象的Cookies集合来读取Cookie,如: <%Response.write Request.Cookies("CookieName")%> 下面以一个完整的例子来讲明Cookie: <% dim Num Num=Request.Cookies("Visit_num") if Num>0 then Num=Num+1 Response.write "您已经是第" & Num & "次访问本站点了。" else Response.write "欢迎您首次访问本站。" Num=1 end if Response.Cookies("Visit_num")=Num %> 在该例子中,首先读取Cookies变量Visit_num,看用户端计算机是否保存有 Cookies变量。若是有该变量,则说明用户已经访问过该页面,同时输入出访问 次数。若是用户是首次访问该页面,则其计算机内不会有Cookies变量,程序会 显示“欢迎”字样,而后将Cookies变量Visit_num存到用户计算机中,以便该用 户下一次访问该页面时给出“访问的次数”信息。 五、Cookie字典 有时在一个页面中可能须要定义不少个Cookies变量,为了更好地管理它, 在Cookies组件中常引入一人的概念“子键”。引用它的语法以下: Request.Cookies("变动名")("子键名") 以下面的Cookie建立一个名为"Dictionary"的字典,其中保存了三个键值: <% Response.Cookie("info")("Myname")="jeff" Response.Cookie("info")("Gender")="male" Response.Cookie("info")("Myheight")="172" %> 事实上客户机上的Cookie字典是以字符串的形式存在: info=Myname=jeff&Gender=male&Myheight=172 若是用户没有指定“子键”名而直接引用Cookies变量,将会返回一个包含 全部的“子键”名及值的字符串。例如上面这个例子包含三个“子键”:"Mynam e"、"Gender"和"Myheight",当用户没有指定其“子键”而直接经过Request.Co okies("info")来引用时,则会获得下列字符串: info=Myname=jeff&Gender=male&Myheight=172 若是要把Cookie中读取的全部数据,能够用下面的代码获得: <%For each cookie in Request.Cookies if Not cookie.HasKeys then Response.write cookie & "=" & Request.Cookies(cookie) Else for each key in Request.Cookies(cookie) Response.write cookie&"("&key&")"&"="& Request.Cookies(cookie)(key) next end if next %> 2。Session其实指的就是访问者从到达某个特定主页到离开为止的那段时间。每 一访问者都会单独得到一个Session。在Web应用程序中,当一个用户访问该应用 时,Session类型的变量能够供这个用户在该Web应用的全部页面中共享数据;如 果另外一个用户也同时访问该Web应用,他也拥有本身的Session变量,但两个用户 之间没法经过Session变量共享信息,而Application类型的变动则能够实现站点 多个用户之间在全部页面中共享信息。 一、SessionID属性 该属性返回当前会话的惟一标志,为每个Session分配不一样的编号。 我曾在开发过程当中就遇到对用户的控制问题。它要实现的功能就是,针对某 个网站的一个模块,当一个会员登陆后正在看此模块时,另外一我的用一样的会员 名登陆,就不能浏览这个模块。也就是说一个会员名同时只能一我的浏览此模块 。我经过用会员名(假设为UserID,惟一)和SessionID来实现了控制。当会员 登陆时,给这个会员一个Session记录登陆状态如:Session("Status")="Logged ",同时把这个会员的Session.SessionID写入数据库。当他要浏览此模块时,先 判断其是否登陆,若已经登陆再判断它的SessionID是否与数据库记录的相同, 若是不一样则不能访问。这样,当另外一个用户用相同的会员名登陆时,那么数据库 中记录的就是新的SessionID,前者访问此模块时就不能经过检查。这就实现了 一个会员名同时只能一我的浏览某个模块。这个功能在一些收费网站有颇有特别 做用,它防止了一个会员名给多我的浏览的问题,为公司保障了利益。 二、TimeOut属性 该属性用来定义用户Session对象的时限。若是用户在规定的时间内没有刷 新网页,则Session对象就会终止。通常默认为20分钟。 三、Abandon方法 该方法是Session对象的惟一方法,能够清除Session对象,用来消除用户的 Session对象并释放其所占的资源。如: <% Session.Abandon %> 四、Session_OnStart和Session_OnEnd事件 和Application同样,当对象的例程每一次启动时触发Session_OnStart事件 ,而后运行Session_Onstart事件的处理过程。也就是说,当服务器接收到应用 程序中的URL的HTTP请求时,触发此事件,并创建一个Session对象。同理,这个 事件也必须定在Global.asa文件中。 当调用Session.Abandon方法时或者在TimeOut的时间内没有刷新,这会触发 Session_OnEnd事件,而后执行里面的脚本。Session变量与特定的用户相联系, 针对某一个用户赋值的Session变量是和其余用户的Session变量彻底独立的,不 会存在相互影响。 Session应用一列: 与Application同样,一个被定义为Session类型的数组只能将整个数组做为 一个对象,用户不能直接改变Session数组中某个元素的值。为了建立一个Sessi on数组,需先定义一个普通的数组,并对它的每个元素赋初值,最后把它定义 为一个Session数组。如: <% dim array() array=array("jeff","zhu","male") Session("info")=array Response.write Session("info")(0) &"-" Response.write Session("info")(1) &"-" Response.write Session("info")(2) &"<br>" %> <hr> <% array(0)="jun" array(1)="li" array(2)="female" Session("info")=array Response.write Session("info")(0) & "-" Response.write Session("info")(1) & "-" Response.write Session("info")(2) & "<br>" %> 以上这段程序输出结果是: jeff-zhu-male _____________ jun-li-female Session是怎样工做的? Session实际上是利用Cookie进行信息处理的,(参见后面有关Cookies的介绍), 当用户首先进行了请求后,服务端就在用户浏览器上建立了一个Cookie,当这个 Session结束时,其实就是意味着这个Cookie就过时了。 为这个用户建立的Cookie的名称是ASPSESSIONID。这个Cookie的惟一目的就是为 每个用户提供不一样的身份认证。 注:若是你对名字是ASPSESSIONID的COOKIE感到好奇,你能够利用ServerVariab les集合的COOKIE Header来接受这个信息,参看下面这个脚本: <%=Request.ServerVariables(“HTTP COOKIE”) %> 你能够刷新不止一次而显示结果依然不变。若是但愿对ServerVariables集合有 Session变量本身不会存在用户浏览器上。不过,ASPSESSIONID这个cookie须要 使用session变量。server使用ASPSESSIONID cookie来将特定的用户和特定的session信息联系起来。没有cookie的话,Serve r就不会了解到每个特定用户在网站中移动的信息。 利用SessionID变量存储ASPSESSIONID cookie和直接对名为ASPSESSIONID的cookie赋值有很大不一样。微软利用了一个复 杂的数学算法对SessionID进行了加密措施,以防止黑客猜想出SessionID的值并 且依据这个得到不应得到的身份或权限。 注:你能够用两种方法屏蔽掉SessionID,一种是将全站进行屏蔽,另一种是 将一个单独Active Server Page进行相应屏蔽。 若是想要将整个站点的Session操做进行屏蔽,你可使用Internet Service Manager。从Application设置对话框,点击Active Server Pages表而且取消对Enable Session State选项的选择。 你还能够在特定的Active Server Page的首行加入使之屏蔽的语句来进行这种操 做。 <% EnableSessionState=False %> 因为Session对象使用了Cookies,那么它的兼容性就受到了限制,一些老的浏览 器显然是不行的,新的浏览器象是NetScape4.0也提供了屏蔽Cookie的选项。 这样就出了问题、因为Cookie不能适用于全部浏览器,那么在建站时你就必须注 意了,若是你的网站定位于大众通用,就必须考虑各类不一样的用户状况。不过现 在确实有能够替代的方法,有些取代Cookies来进行身份认证的方法将在后面的 注:当前浏览器,是否发送一个Cookie在URL是区分大小写的,所以,微软提醒你 最好使用一样的大小写方式,例如一块儿使用/WWW/mypage.asp和/www/mypage.asp 确定会使浏览器出错。

相关文章
相关标签/搜索