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)等等。。。

关于Cookie的有关内容的更多相关文章

  1. JavaWeb学习总结(十六)Cookie保存中文内容

    Cookie的值保存中文内容,可以使用Java.net.URLDecoder进行解码. 示例: <%@page import="java.net.URLDecoder"%&g ...

  2. cookie 暂时保存内容与恢复

    <script type="text/javascript"> $(function(){ $('.ycb_anniu').click(function(){ $.co ...

  3. python 携带cookie获取页面内容

    有时会遇到爬取的页面需要登录,这就要带上cookie了. 下面记录了几种携带cookie的方法 # coding=utf-8 import requests s = requests.Session( ...

  4. 【转】彻底搞清C#中cookie的内容

    http://blog.163.com/sea_haitao/blog/static/77562162012027111212610/ 花了2天时间,彻底搞清C#中cookie的内容,搞清以下内容将让 ...

  5. cookie——小甜品

    Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明.Cookie英文意指饼干,不过在电脑术语中它可不像饼干那么简单.简单的说,Cookie就是服务器暂存放在你计算机上的一 ...

  6. Cookie和Session的区别

    前言 HTTP是一种无状态的协议,为了分辨链接是谁发起的,就需要我们自己去解决这个问题.不然有些情况下即使是同一个网站我们每打开一个页面也都要登录一下.而Session和Cookie就是为解决这个问题 ...

  7. js cookie

    cookie:cookis:储存数据,当用户访问了某个网站的时候,我们就可以通过cookie来向访问者电脑上储存数据1)不同浏览器的存放cookie位置不一样,也是不能通用的2)cookie的存储是以 ...

  8. cookie (储存在用户本地终端上的数据)

    Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).定义于 RFC2109 和 2965 中的都已废弃 ...

  9. PHP之session与cookie

    1.session与cookie的关系 众所周知,session是存储在服务器端,cookie是存储在客户端,如果禁用了浏览器的cookie功能,很多时候(除非进行了特殊配置)服务器端就无法再读取se ...

随机推荐

  1. C/C++中文的编码和字符串处理

    windows平台 char 表示单字符,占用一个字节 wchar_t 表示宽字符,占用两个字节 Linux平台 char 占用一个字节 wchar_t 占用四个字节 windows平台下对于用字符串 ...

  2. (传智博客)tp开发第一天之tp执行流程分析笔记

    1.入口文件index.php 2.ThinkPHP/ThinkPHP.php require THINK_PATH.'Common/runtime.php'; 3.ThinkPHP/Common/r ...

  3. MVVM模式应用 之在ViewModel中使用NavigationService

    在ViewModel.cs页面中是不能使用NavigationService,那该怎么实现跳转呢? 其实在ViewModel中实现页面的跳转也很简单,下面的代码: using Microsoft.Ph ...

  4. 笔记一:Python的PyDev插件在eclipse上面安装(新的插件地址 location)

    注:部分内容参考网上的,若有侵权,请作者联系我,马上进行删改 安装PyDev: 首先需要去Eclipse官网下载:http://www.eclipse.org/,Eclipse需要JDK支持,如果Ec ...

  5. 一次 php nusoap 调试过程

    今天跟同事调用一个数据api ,用soap方式调用.本以为很简单的事情,却弄到了晚上. 因为有过调试经验,直接按照以往的过程直接部署,结果是错误. 1. 以为是调用方式错了,问了一下对接的同事,没问题 ...

  6. KVC 与 KVO 理解-b

    KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一 ...

  7. mvc Model元数据【学习笔记】

    页面中Html.Editorfor(model=>model.fieldname)这些方法,都是通过Model的元数据来生成html的,我们如果想控制最终生成的html,可以通过修改元数据来实现 ...

  8. 4d tensor

    偶然在一个ppt中看到了如下关于tensor的解释,清晰明白,所以post在这里,以备后续查看 根据这个理解: theano中的input(4d tensor):[mini-batch size, n ...

  9. 前端图片预览,上传前预览,兼容IE7、8、9、10、11,Firefox,Chrome(学习到的知识)

    文章地址:http://www.cnblogs.com/rubylouvre/p/4597344.html 一.window.URL 在Chrome中,window.URL和window.webkit ...

  10. ARCI--做事情的重要方法论

    很多朋友都可能碰到这样的情况,有一个任务曾经开会讨论过,目标,时间,参与人都有提到,但是最终就是不了了之,没有下文了,而且后面想起来,要追究责任的时候,发现似乎都没有责任,无从追究.如果这种情况出现, ...