关于Cookie的有关内容
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的有关内容的更多相关文章
- JavaWeb学习总结(十六)Cookie保存中文内容
Cookie的值保存中文内容,可以使用Java.net.URLDecoder进行解码. 示例: <%@page import="java.net.URLDecoder"%&g ...
- cookie 暂时保存内容与恢复
<script type="text/javascript"> $(function(){ $('.ycb_anniu').click(function(){ $.co ...
- python 携带cookie获取页面内容
有时会遇到爬取的页面需要登录,这就要带上cookie了. 下面记录了几种携带cookie的方法 # coding=utf-8 import requests s = requests.Session( ...
- 【转】彻底搞清C#中cookie的内容
http://blog.163.com/sea_haitao/blog/static/77562162012027111212610/ 花了2天时间,彻底搞清C#中cookie的内容,搞清以下内容将让 ...
- cookie——小甜品
Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明.Cookie英文意指饼干,不过在电脑术语中它可不像饼干那么简单.简单的说,Cookie就是服务器暂存放在你计算机上的一 ...
- Cookie和Session的区别
前言 HTTP是一种无状态的协议,为了分辨链接是谁发起的,就需要我们自己去解决这个问题.不然有些情况下即使是同一个网站我们每打开一个页面也都要登录一下.而Session和Cookie就是为解决这个问题 ...
- js cookie
cookie:cookis:储存数据,当用户访问了某个网站的时候,我们就可以通过cookie来向访问者电脑上储存数据1)不同浏览器的存放cookie位置不一样,也是不能通用的2)cookie的存储是以 ...
- cookie (储存在用户本地终端上的数据)
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).定义于 RFC2109 和 2965 中的都已废弃 ...
- PHP之session与cookie
1.session与cookie的关系 众所周知,session是存储在服务器端,cookie是存储在客户端,如果禁用了浏览器的cookie功能,很多时候(除非进行了特殊配置)服务器端就无法再读取se ...
随机推荐
- gulp分享文档
Grunt--I/O操作: 读取A → A.a() → 写出A → 读取A → A.b() → 写出A; gulp--数据流:读取A → A.a() → A.b() → 写出A. Part① 构建gu ...
- hdu 1018 Big Number (数学题)
Problem Description Inmany applications very large integers numbers are required. Some of theseappli ...
- MVVM模式应用 之NotificationObject类
public abstract class NotificationObject : INotifyPropertyChanged { public event PropertyChanged ...
- css字体大小设置em与rem的区别
em 单位em是相对于父元素的,如果父元素没有设置字体大小,那就会追溯到body. 比如 如果我在box_text的父元素box加了一个字体大小 那么body的8px就会被box_text的父元 ...
- C#程序中:如何修改xml文件中的节点(数据)
要想在web等程序中实现动态的数据内容给新(如网页中的Flash),不会更新xml文件中的节点(数据)是远远不够的,今天在这里说一个简单的xml文件的更新,方法比较基础,很适合初学者看的,保证一看就懂 ...
- php5.4安装ecshopphp5.4问题及解决
includes/cls_template.php line422 将 $tag_sel = array_shift(explode(" ", $tag)); 这句话拆开为两句. $tag_exp = ...
- php基础知识【函数】(1)数组array
一.排序 1.sort -- 从最低到最高排序,删除原有的键名,赋予新的键名[字母比数字高] 2.rsort -- 逆向排序(最高到最低),删除原有的键名,赋予新的键名[字母比数字高] 3.asort ...
- Python 统计代码行
正在学习 Python, 做了个统计代码行的功能, 参考了网上很多前辈的帖子,添加了感觉还是比较实用的功能, 只是windows下测试了,而且代码文件编码形式是 utf-8的. 如果使用其它编码形式的 ...
- LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法
LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...
- 0x1L
整形常量的后缀表示其类型,包括如下后缀,其中U和L的大小写通用 后缀 类型L long int LL long long int U ...