1.首先谈谈http协议与状态保持。
Http协议本身是无状态的,这与http协议本来的目的是相符的,客户端只需要简单的向服务器发出请求操作,然后服务器对请求作出响应。无论客户端还是服务器都没有必要记录彼此的过去的行为,每一次请求之间都是独立的。
不过生活中确实有另外一种需求,比如:某家咖啡店有喝5杯咖啡送一杯的优惠 ,然而一次性消费5杯咖啡的机会微乎其微,这时就需要用一种方式来记录某位顾客消费咖啡的数量。想象一下,其实也就是下面几种情况:
1.该店的店员很厉害,能记住每位顾客的消费数量,只要顾客已进入咖啡店,店员就知道该怎样对待。这种做法就是协议本身支持的状态。
2.顾客每消费一次,店员送一张卡片,当顾客收集到5张卡片,就会享受的该店的优惠。这种做法保存在客户端。
3.顾客一种会员卡,出了卡号以外什么信息也不记录,每次消费时没如果顾客出示这张会员卡,则店员在店里的记录上找到这个卡号对应的消费记录,这种做法就是保存在服务器端的。
由于http是无状态的,而出于种种考虑也不希望让其变成有状态的,因此,上述中,后两种方案也就变成了现实的选择。具体来说cookie机制采用的就是"在客户端保持的方案";而session机制采用的是在服务器端保存的机制。同时我们也看到,由于采用在服务器端保存信息的状态的方案在客户端也需要保存一个标志,所以session机制可能需要借助于cookie 机制来达到保存标志的目的,但实际上他还有其他选择。
2.会话跟踪技术
我们可以会话理解成客户端和服务端之间的一次会晤,在一次会晤中可能包含多次请求和响应。在javaWeb中,客户向某一个服务器发出一个请求开始,会话就开始啦,直到客户关闭浏览器。在一个会话的多次请求中共享数据,这就是会话跟踪技术。例如在一个会话中的请求如下:
(1)请求12306主页 (2)请求登陆(请求参数是用户名和密码) (3)预定车票
(4)支付宝付款 (5)购票成功
在上面的会话中当前的用户信息必须在这个会话中共享,也就是说必须在一个会话的过程中具有共享数据的能力。会哈的跟踪技术就是Cookie或Seesion
3.Cookie详解
cookie,服务器通过response设置"set-cookie"头是映射的值("若干个用;隔开的键值对")
客户端访问服务器,服务器有一个专用的叫做"Set-Cookie"相应头,该头的值是一个键值对,客户端接收到set--Cookie,自动将他保存到客户端
当客户端再次访问服务器时,之前的保存到客户端的cookie信息自动加载到请求头的信息中(请求头名叫Cookie,值就是之前保存到客户端的键值对),发送给服务器,服务器通过response,getHeader(“Cookie”)就能获取相应的键值对的信息了
代码示例:AServlet发送Set-cookie头,BServlet接收Cookie头
Aservlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("Set-Cookie", "username=zs");
}
BServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name =request.getHeader("cookie");
response.getWriter().print(name);
}
运行AServlet后的相应头:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: username=zs
Content-Length: 0
Date: Sat, 04 Jul 2015 08:53:16 GMT
运行BServlet后的结果和请求协议:
username=zs
GET /08/servlet/BServlet HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: localhost:8080
Connection: Keep-Alive
Cookie: username=zs
(1)相应头:Set-Cookie:key1=value1
(2)请求头:Cookie:key=value
如果服务器端发送重复的cookie的,那么会覆盖原有的cookie,
不同的浏览器之间是不共享cooki的,也就是说在你使用IE访问服务器时,服务器会把cookie发送到IE客户端,然后又IE客户端保存,当你使用火狐访问服务器时,不能把IE保存的cookie发送到服务器。
那么:cookie能做什么那?
(1)服务器使用cookie来跟踪客户端的状态
(2)保存购物车(购物车中的商品不能使用request保存),因为他是一个用户向服务器发送的多个请求信息
(3)显示上次的登录名
(4)等等。。。