Cookie是一种会话技术,它用于将会话过程中的数据保存到用户的浏览器中,从而使浏览器和服务器可以更好地进行数据交互。
在现实生活中,当顾客在购物时,商城经常会赠送顾客一张会员卡,卡上记录客户的个人信息(姓名,手机号等),消费额度和积分额度等。顾客一旦接受了会员卡,以后每次光临该商场时,都可以使用这张会员卡,商场也将根据会员卡上的消费记录计算会员的优惠额度和累加积分。
在web应用中,Cookie类似这张会员卡,当用户通过浏览器访问web服务器时,服务器会给客服端发送一些信息,这些信息都保存在Cookie中。这样,当该浏览器再次访问服务器时,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。
服务器向客服端发送Cookie时,会在HTTP响应头字段中增加Set-Cookie响应头字段。
Set-Cookie头字段中设置的Cookie遵循一定的语法格式,具体示例如下。
Set-Cookie: user=itcast; Path=/;
user表示Cookie名称,itcast表示Cookie的值,Path表示Cookie的属性。需要注意的是,Cookie必须以键值对的形式存在,其属性可以有多个,这些属性之间必须以分号和空格分隔。
当用户第一次访问访问服务器时,服务器会在响应消息头中增加Set-Cookie头字段,将用户信息以Cookie的形式发送给浏览器。一旦用户浏览器接受了服务器发送的Cookie信息,就会将它保存在浏览器的缓冲区中。这样,当浏览器后续访问该服务器时,都会在请求消息中将用户信息以Cookie的形式发送给web服务器,从而使服务器端分辨出当前请求是由哪个用户发出的。
Cookie技术可以将用户信息保存在各自的浏览器中,并且可以在多次请求下实现数据的共享。但是,如果传递的数据较多,使用Cookie技术显然会增大服务器端程序处理的难度,这时,可以使用session技术。session技术是一种将会话数据保存到服务器端的技术。
当人们去医院就诊时,就诊病人需要办理医院的就诊卡,该卡上只有卡号,而没有其他信息。但病人每次去该医院就诊时,只要出示就诊卡,医务人员便可根据卡号查询到病人的就诊信息。
Session技术就好比医院发给病人的就医卡和医院为每个病人保留病例档案的过程。
当浏览器访问web服务器时,Servlet容器就会创建一个Session对象和ID属性,其中,Session对象就相当于病例档案,ID就相当于就诊卡号。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。
需要注意的是,由于客户端需要接收,记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。
用户甲和用户乙都调用buyServlet将商品添加到购物车中,调用payServlet进行商品结算。
由于甲和乙购买商品的过程类似,以用户甲为例进行说明。
当用户甲访问购物网站时,服务器为甲创建了一个Session对象(相当于购物车)。当甲将小米手机添加到购物车中时,小米手机的信息便存放到了Session对象中。同时,服务器将Session对象的ID属性以Cookie(Set-Cookie: JSESSIONID=111)的形式返回给甲的浏览器。
当甲完成购物进行结算时,需要向服务器发送结账请求,这时,浏览器自动在请求消息头中将Cookie(Cookie:JSESSIONID=111)信息回送给服务器,服务器根据ID属性找到为用户甲所创建的Session对象,并将Session对象中所存放的小米手机信息取出进行结算。