撩下Cookie和Session

图片Cookie

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

 

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

 

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访问。 cookie

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

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

cookie最典型的应用是

(一):判断用户是否登录过网站,以便下次登陆时可以直接登陆。若是咱们删除cookie,则每次登陆必须重新填写登陆的相关信息。

(二):另外一个重要的应用是“购物车”中类的处理和设计。用户可能在一段时间内在同一家网站的不一样页面选择不一样的商品,能够将这些信息都写入cookie,在最后付款时从cookie中提取这些信息,固然这里面有了安全和性能问题须要咱们考虑了。

Session

因为HTTP协议是无状态的协议,因此服务端须要记录用户的状态时,就须要用某种机制来识具体的用户,这个机制就是Session.典型的场景好比购物车,当你点击下单按钮时,因为HTTP协议无状态,因此并不知道是哪一个用户操做的,因此服务端要为特定的用户建立了特定的Session,用用于标识这个用户,而且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个惟一标识。在服务端保存Session的方法不少,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,通常会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务好比Memcached之类的来放 Session。

思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次建立Session的时候,服务端会在HTTP协议中告诉客户端,须要在 Cookie 里面记录一个Session ID,之后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,若是客户端的浏览器禁用了 Cookie 怎么办?通常这种状况下,会使用一种叫作URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。

总结

Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据能够保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

相关文章
相关标签/搜索