HTTP无状态协议,是指协议对 于事务处理没有记忆能力。缺乏状态意味着若是后续处理须要前面的信息,则它必须重传,这样可能致使每次链接传送的数据量增大。另外一方面,在服务器不须要先前信息时它的应答就较快。
客户端与服务器进行动态交互的Web应用程序出现以后, HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是须要承前启后的,简单的购物车程序也要知道用户到底在以前选择了什么商品。因而,两种用于 保持HTTP链接状态的技术就应运而生了,一个是 Cookie,而另外一个则是 Session。 HTTP自己是一个无状态的链接协议,为了支持客户端与服务器之间的交互,咱们就须要经过不一样的技术为交互存储状态,而这些不一样的技术就是Cookie和Session了。Cookie是经过客户端保持状态的解决方案。从定义上来讲,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,而后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。让咱们说得更具体一些:当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的我的信息而且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些我的信息,固然这些信息并非存放在HTTP响应体(Response Body)中的,而是存放于HTTP响应头(Response Header);当客户端浏览器接收到来自服务器的响应以后,浏览器会将这些信息存放在一个统一的位置,对于Windows操做系统而言,咱们能够从: [系统盘]:Documents and Settings[用户名]Cookies目录中找到存储的Cookie;自此,客户端再向服务器发送请求的时候,都会把相应的Cookie再次发回至服务器。而此次,Cookie信息则存放在HTTP请求头(Request Header)了。斜体文字redis
有了Cookie这样的技术实现,服务器在接收到来自客户端浏览器的请求以后,就可以经过分析存放于请求头的Cookie获得客户端特有的信息,从而动态生成与该客户端相对应的内容。一般,咱们能够从不少网站的登陆界面中看到“请记住我”这样的选项,若是你勾选了它以后再登陆,那么在下一次访问该网站的时候就不须要进行重复而繁琐的登陆动做了,而这个功能就是经过Cookie实现的。与Cookie相对的一个解决方案是Session,它是经过服务器来保持状态的。因为Session这个词汇包含的语义不少,所以须要在这里明确一下 Session的含义。首先,咱们一般都会把Session翻译成会话,所以咱们能够把客户端浏览器与服务器之间一系列交互的动做称为一个 Session。从这个语义出发,咱们会提到Session持续的时间,会提到在Session过程当中进行了什么操做等等;其次,Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。从这个语义出发,咱们则会提到往Session中存放什么内容,如何根据键值从 Session中获取匹配的内容等。
要使用Session,第一步固然是建立Session了。那么Session在什么时候建立呢?固然仍是在服务器端程序运行的过程当中建立的,不一样语言实现的应用程序有不一样建立Session的方法,而在Java中是经过调用HttpServletRequest的getSession方法(使用true做为参数)建立的。在建立了Session的同时,服务器会为该Session生成惟一的Session id,而这个Session id在随后的请求中会被用来从新得到已经建立的Session;在Session被建立以后,就能够调用Session相关的方法往Session中增长内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求以后就会依据Session id找到相应的Session,从而再次使用之。正是这样一个过程,用户的状态也就得以保持了。
综上所述,HTTP自己是一个无状态的链接协议,为了支持客户端与服务器之间的交互,咱们就须要经过不一样的技术为交互存储状态,而这些不一样的技术就是Cookie和Session了。数据库
cookie数据存放在客户的 浏览器上,服务器可以知道其中的信息;
若是在浏览器中 不设置过时时间,cookie被保存在 内存中,生命周期随 浏览器的关闭而结束,这种cookie简称会话cookie。若是在浏览器中设置了cookie的过时时间,cookie被保存在硬盘中,关闭浏览器后,cookie数据仍然存在,直到过时时间结束才消失。后端
单个cookie保存的数据 不能超过4KB,一个服务器最多在客户端浏览器上保存 20个Cookie,一个浏览器最多保存 300个Cookie;
cookie只能保存字符串类型,以 文本的方式
cookie技术有4个组件:在HTTP响应报文中有一个cookie首部行;在HTTP请求报文中有一个cookie首部行;在用户端系统中保留有一个cookie文件,并由用户的浏览器进行管理;位于Web站点的一个后端数据库
cookie中若是设置了路径参数,那么同一个网站中不一样路径下的cookie互相是访问不到的。
大小受限、用户能够操做(禁用)cookie,使功能受限、、安全性较低、有些状态不可能保存在客户端、每次访问都要传送cookie给服务器,浪费带宽、cookie数据有路径(path)的概念,能够限制cookie只属于某个路径下。
携带cookie进行数据请求跨域
cookie数据始终在同源的http请求中携带(即便不须要),即cookie在浏览器和服务器间来回传递;
每次请求一个新的页面的时候cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还须要指定做用域,不可跨域调用。
session数据放在 服务器上,客户端不知道其中的信息,不过session能够经过特殊的方式作持久化管理(memcache,redis);
session在何时建立,以及session一致性问题浏览器
session会在 必定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
当程序须要为某个客户端的请求建立一个session时,服务器首先 检查这个客户端的请求里 是否已包含了一个 session标识(称为session id),若是已包含则说明之前已经为此客户端建立过session,服务器就 按照session id把这个session检索出来使用( 检索不到,会新建一个),若是客户端请求不包含session id,则为客户端建立一个session而且生成一个与此session相关联的session id, session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个session id的方式能够采用cookie,这样在交互过程当中浏览器能够自动的按照规则把这个标识发送给服务器。一般使用cookie方式存储sessionid到客户端,在交互中浏览器按照规则将sessionid发送给服务器。若是用户禁用cookie,则要使用URL重写,能够经过response.encodeURL(url)
进行实现;API对encodeURL的结束为,当浏览器支持Cookie时,url不作任何处理;当浏览器不支持Cookie的时候,将会重写URL将SessionID拼接到访问地址后。安全
session 大小没有限制
session中保存的是 对象,session经过相似与Hashtable的数据结构来保存,能支持任何类型的对象(session中可含有多个对象)
Session用于保存每一个用户的专用信息,变量的值保存在服务器端,经过SessionID来区分不一样的客户。
session不能区分路径,同一个用户在访问一个网站期间,全部的session在任何一个地方均可以访问到。
Session保存的东西越多,就越占用服务器内存,对于用户在线人数较多的网站,服务器的内存压力会比较大、依赖于cookie(sessionID保存在cookie),若是禁用cookie,则要使用URL重写,不安全、建立Session变量有很大的随意性,可随时调用,不须要开发者作精确地处理,因此,过分使用session变量将会致使代码不可读并且很差维护。