`
uule
  • 浏览: 6305914 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

Cookie与Session

 
阅读更多

Session机制详解

网站Cookie是什么

Cookie与Session详解

Cookies

 

满多少次送1次  理发等 

 

Cookie:

 

HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样。 

 

然而聪明的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用,就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范以响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。 

 

Cookies是作为HTTP传输的头信息的一部分发给客户机的,所以向客户机发送Cookies的代码一般放在发送给浏览器的HTML文件的标记之前。

 

正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。 

而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。

  

由于Cookies的信息并不都是以文件形式存放在计算机里,还有部分信息保存在内存里。比如你在浏览网站的时候,Web服务器会自动在内存中生成Cookie,当你关闭IE浏览器的时候又自动把Cookie删除

 

默认情况下,如果在某个页面创建了一个cookie,那么该页面所在目录中的其他页面也可以访问该cookie。如果这个目录下还有子目录,则在子目录中也可以访问

例如在www.xxxx.com/html/a.html中所创建的cookie,可以被www.xxxx.com/html/b.html或www.xxx.com/ html/some/c.html所访问,但不能被www.xxxx.com/d.html访问。 

语法如下: document.cookie="name=value; path=cookieDir"; 其中cookieDir表示可访问cookie的目录。

例如: document.cookie="userId=320; path=/shop"; 就表示当前cookie仅能在shop目录下使用。 如果要使cookie在整个网站下可用,可以将cookie_dir指定为根目录,例如: document.cookie="userId=320; path=/"; 

  

hosts文件实际上可以看成一个本机的DNS系统,它可以负责把域名解释成IP地址,它的优先权比DNS服务器要高,它的具体实现是TCP/IP协议中的一部分。

  

一、cookie机制和session机制的区别

***********************************************************************

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

同时我们也看到,由于服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的但实际上还有其他选择

  

二、会话cookie持久cookie的区别

***********************************************************************

如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。

  如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间,如果过了此期限Cookies就自动被删除

 

  存储在硬盘上的cookie可以在不同的浏览器进程(注意不是不同的浏览器)间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。

  

三、cookie如何解决快浏览器共享?

就是在IE里浏览器一个网站存了一些cookie,如何在别的浏览器再次打开这个网站还能去读到这些cookie.

 

cookie多浏览器实际上也是cookie跨域解决方案的范畴。

可通过cookie + JSONP来实现

 

cookies属于隐私数据,不同浏览器保存在不同地方。不可能共享的

再说了市面上也基本见不到跨浏览器共享cookie的网站

 

在同一个浏览器中,打开不同的网站可以读取cookie是可以实现的,也就是所谓的跨域访问cookie

 

那个应该叫跨浏览器访问cookie 而不是跨域

跨域的概念是: b域试图访问a域下的资源。

你用firefox打开的web.qq.com, 难道用ie或者chrome代开的难道不是这个域名了

存储和跟踪用户数据的方式不仅现于cookie, 比如可以记住你的ip, 或者让上所说使用flash

大概搜索了下 没找到所谓的跨浏览器操作cookie

  

 

Session:

 

 session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。 

 

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

 

Session是什么

 

HTTP协议是一种无状态的协议,用户通过浏览器访问服务端的每次请求都是相互独立的,服务端无法直接通过HTTP请求来判断上次请求的用户和本次请求的用户是否是同一人,当然,你可以使用Cookie来传递用户状态的标识,但是每次发起请求都必须来回传递这些Cookie数据,为了实现更多的状态跟踪,传递的Cookie数据会越来越多,这无形中增加了浏览器与服务端的数据传输的压力和复杂性,Cookie的大小不仅有限制,而且这种方式是不安全的,容易被盗取和篡改,然而session的出现正解决了这些问题session是存储于服务端的、用于记录和保持某些状态的一种会话跟踪技术。用户通过浏览器发起请求的时候,不用每次都回传所有的Cookie值了,只要回传一个key-value的键值对就可以了,一般情况下这个key为JSESIONID,value为客户端第一次访问服务端时生成的唯一值,这个value可以标识和跟踪用户的会话信息,这个value在服务端被习惯称作sessionId。

 

如何实现保持会话

 

正常情况下,用户第一次通过浏览器请求服务端的时候是没有value的,此时服务端会通过request.getSession()方法创建一个HttpSession对象,并给它设置一个有效期,然后将这个对象存储在sessions的容器中,同时会把sessionId返回给浏览器端。如果用户再次发起请求,服务端在解析得到sessionId后,会判断sessionId对应的HttpSession是否存在,如果不存在,会创建一个HttpSession对象,并将这个对象存储在sessions的容器中,同时会把sessionId返回给浏览器端;如果存在,将可以得到对应的HttpSession对象,这个HttpSession对象可以存储很多状态或表示数据,如session.setAttribute(),从而实现会话跟踪。

 

session对象都有一个有效期,一般情况下,应用容器都会有一个后台线程用于检查每个session是否失效,如果失效将会被清除。而值得注意的是,调用request.getSession()时会检查对应的session对象是否过期,如果过期将会创建一个新session对象。

 

在应用容器重启或关闭的时候,未过期的session对象会被持久化到一个SESSIONS.ser文件中,当应用容器再次启动的时候,会重新读取SESSIONS.ser中所有未过期的session对象,并将它们存储到sessions集合中。一个应用服务器存储一套session数据。

 

一、保存session id的几种方式

1、cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。

 

 

 

2、由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。

附加方式也有两种,

一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 

另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 

 

这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。 

为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。 

 

3、另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如下面的表单: 

   

   <form name="testform" action="/xxx"> 

<input type="text"> 

    </form> 

 

    在被传递给客户端之前将被改写成: 

 

    <form name="testform" action="/xxx"> 

<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> 

<input type="text"> 

    </form> 

 

    这种技术现在已较少应用,很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。 

实际上这种技术可以简单的用对action应用URL重写来代替。 

 

 

二、session什么时候被创建

一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建

 

注意如果JSP没有显示的使用 <%@page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历。

  

三、session何时被删除

 

session在下列情况下被删除:

A.程序调用HttpSession.invalidate()

B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间

C.服务器进程被停止

再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。

 

四、是否只要关闭浏览器,session就消失了

程序一般都是在用户做login off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。

之所以会有这种错误的认识,是因为大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session。

如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求报头,把原来的session id发送到服务器,则再次打开浏览器仍然能够找到原来的session。

恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

 

由此我们可以得出如下结论:

  关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。

 

 

五、打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session

 

通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的session id,这样我们信息共享的目的就达不到了。

此时我们可以先把session id保存在persistent cookie中(通过设置session的最大有效时间),然后在新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session cookie和persistent cookie的结合我们就可以实现了跨窗口的会话跟踪。

 

==============================================================

今天在测试Ticket时,发现原来保存的Cookie莫名其妙的就被清除了,自己没有做过任何的改动。经开发人员Allon推断,应该是Cookie数量达到了浏览器的限制。

 

网上查找出来的结果是:

 

一、浏览器允许每个域名所包含的cookie数:

 

  Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie。

  Firefox每个域名cookie限制为50个。

  Opera每个域名cookie限制为30个。

  Safari/WebKit貌似没有cookie限制。但是如果cookie很多,则会使header大小超过服务器的处理的限制,会导致错误发生。

 

  注:“每个域名cookie限制为20个”将不再正确!

 

二、当很多的cookie被设置,浏览器如何去响应。

 

  除Safari(可以设置全部cookie,不管数量多少),有两个方法:

  最少最近使用(leastrecentlyused(LRU))的方法:当Cookie已达到限额,自动踢除最老的Cookie,以使给最新的Cookie一些空间。Internet Explorer和Opera使用此方法。

 

  Firefox很独特:虽然最后的设置的Cookie始终保留,但似乎随机决定哪些cookie被保留。似乎没有任何计划(建议:在Firefox中不要超过Cookie限制)。

 

三、不同浏览器间cookie总大小也不同:

 

  Firefox和Safari允许cookie多达4097个字节,包括名(name)、值(value)和等号。

  Opera允许cookie多达4096个字节,包括:名(name)、值(value)和等号。

  Internet Explorer允许cookie多达4095个字节,包括:名(name)、值(value)和等号。

 

      注:多字节字符计算为两个字节。在所有浏览器中,任何cookie大小超过限制都被忽略,且永远不会被设置。

  • 大小: 32.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics