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. 将[{},{}]转为dict

    经常遇到一种需求,需要把从数据库取出的数据,转为dict对象([{}, {},...]-->dict). rs = [{, , "name":"edf"} ...

  2. [Machine Learning] 梯度下降(BGD)、随机梯度下降(SGD)、Mini-batch Gradient Descent、带Mini-batch的SGD

    一.回归函数及目标函数 以均方误差作为目标函数(损失函数),目的是使其值最小化,用于优化上式. 二.优化方式(Gradient Descent) 1.最速梯度下降法 也叫批量梯度下降法Batch Gr ...

  3. 如何禁用easyui-linkbutton 中的Click事件

    eg: <a id="btn" href="#" class="easyui-linkbutton" data-options=&qu ...

  4. CoffeeScript飞一样的写javascript

    之前看到同事在使用coffeescript写js,当我看到那简介的coffee文件,就深深的被coffescript吸引了,简洁的语法,熟练之后会大大提升javascript的开发速度,写脚本也能像飞 ...

  5. session cookie 相结合实现

    数据库配置文件 config.php <?php// config.php 数据库连接文件define('DB_HOST', 'localhost');define('DB_USER', 'ro ...

  6. 一. 什么是ANR?为什么会有ANR发生?

    对于Android平台的工程师来说,ANR应该是每个人都会遇到的问题,因为导致它的原因有很多,例如在主线程进行耗时操作,调用大量cpu资源进行复杂的预算等,并且可能在大多数情况下,这类问题不会发生,只 ...

  7. 使用PHP生成二维码的两种方法(带logo图像)

    一.利用Google API生成二维码 Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  8. Hive的Metastore contains multiple versions

    hive 客户端报错:Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeExcepti ...

  9. Android 开发环境搭建9传送帖)

    ---恢复内容开始--- 首先,得安装软件,感觉我所找到的一些课本上写的都比较简略,走过一些弯路后,决定按照这个百度经验来 Android安卓开发环境搭建详细教程 http://jingyan.bai ...

  10. c语言技巧--长期更新

    1.   #define LOWER(c)            (unsigned char)(c | 0x20) 换成小写 2.   gcc -Wall -Werror //告警当成 错误来处理 ...