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#.net生成静态页面的方法

    ASP.NET生成静态页面方法主要有三种   第一种方法:向服务器的动态页面发送请求,获取页面的html代码.这种方法缺点显而易见:速度慢.另外如果请求的动态页面有验证控件的话,返回的html页面却无 ...

  2. map函数(转)

    STL中map用法详解 说明:如果你具备一定的C++ template知识,即使你没有接触过STL,这个文章你也应该可能较轻易的看懂.本人水平有限,不当之处,望大家辅正. 一.Map概述 Map是ST ...

  3. PHP设计模式之:外观模式

    外观模式: 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用: 外观模式又称为门面模 ...

  4. C#如何释放已经加载的图片 (转)

    使用Image.FromFile取磁盘上的图片时,这个方法会锁定图片文件,而且会导致内存占用增大, 有几种方法解决: 一:将Image类转换成Bitmap类 System.Drawing.Image ...

  5. React Native:使用 JavaScript 构建原生应用 详细剖析

    数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生的 iOS 应用——就在今天,Beta 版的仓库释出了! 基于 Pho ...

  6. CURL传输与获取功能

    什么是CURL? 利用URL语法爱命令行方式下工作的文件传输工具.它支持很多协议.它支持认证功能.php中常用都实现更复杂的传输功能. 实现的功能: 1.实现远程获取和采集内容 2.实现PHP 网页版 ...

  7. 关于 Log4Net

    Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运 ...

  8. C++中Reference与指针(Pointer)的使用对比

    整理日: 2015年3月18日 引用(reference)和指针(pointer)是学C++过程中最令人头疼的问题,常常不知道什么时候用哪个合适,又常常弄混.找到Dan Saks的这篇文章,讲的很清楚 ...

  9. Codeforces Round #Pi (Div. 2)

    上次比完赛就准备写了, 结果懒癌发作了, 拖到了现在. Problem_A: 题意: 在一条x轴上有n座城市, 每个城市之间的距离就是它们对应坐标的距离, 现在求出每个城市到其他城市的最近距离和最远距 ...

  10. 使用OPCDAAuto.dll编写C# OPC采集程序

    在一台新机器上运行使用OPC自动化接口编写的C#程序报错如下: 索 COM 类工厂中 CLSID 为 {28E68F9A-8D75-11D1-8DC3-3C302A000000} 的组件失败,原因是出 ...