Http中Cookie和Session介绍
先介绍下B/S系统的工作的完整过程。首先客户端的浏览器发出请求,服务端的webserver接受到请求后,调用相关请求的页面进行处理,处理完后将结果发送给客户端的浏览器进行显示。只能是浏览器向webserver发送请求,webserver响应请求,而webserver不会主动的向客户端发送信息。因为它不知道向谁发送哪些信息。把服务端比喻成一个矜持的小姑娘,你问她要什么她才会回答什么。浏览器与webserver的交互是暂时的,当请求响应的过程完毕后,这种连接也随之结束。换句话说webserver根本不理会是哪个浏览器发来的请求,只要请求合理、符合要求,就要对其作出响应。
之所以会向上段介绍的那样,是因为Http是无状态的协议,无法保存浏览器的状态信息。因此需要记住:只有浏览器发送请求,页面才会执行;对于不同客户端对同一个页面发送请求,它们之间的执行是互不干扰的、完全无关的。对于同一浏览器发出的不同页面的请求,也是独立执行的。因为webserver根本就不知道同一浏览器发来的请求,因此不同页面之间的信息也就不能共用。
Http的这种无状态情形,给开发系统带来了很多麻烦,因为绝大部分系统都采用用户机制。为了解决此种情形,出现了Cookie和Session技术。
让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:
1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。
2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。
3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。
由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。
一、Cookie介绍
Cookie是一种采用将数据保存在客户端硬盘上的技术,是一种远程浏览器端储存数据并以此来跟踪和识别用户的机制。在浏览器向webserver发送请求时候,会首先将Cookie中保存的信息发送出去。因此webserver也就能够根据这些数据判断请求者的状态了。
虽然说cookie给我们带来了诸多的便利,但是其本身也存在些缺点:
第一、Cookie保存在客户端硬盘上,客户端每次发送请求都要发送Cookie。如果cookie数据量比较大,加上每次都要发送,此时会增加网络传输的数据量,增加页面的响应时长,从而降低服务器的工作效率,因此Session技术很好的解决了这个问题;
第二、安全性不高。Cookie采用文本方式储存在本地硬盘,保存在里面的数据很容易被破解。例如把用户名和密码保存在cookie中,任何一个能够使用客户端计算机的人都会很容易的进入这个系统;
第三、有些用户出于安全考虑,会禁用浏览器的Cookie功能。恰好系统是依靠Cookie机制,那这部分人群将无法使用这个系统;
第四、IE浏览器的不完善的缓存机制。
二、Session介绍
Cookie的两大缺点,传输Cookie需要消耗网络资源;保存在本地容易被破解。而Session却可以弥补这两方面。Session保存在服务端,因此安全性更高,速度也更快。将session和cookie两者相结合。cookie只是用来识别用户,而session用来保存数据,这样可以编写出效率更高的系统。
PHP中session的工作原理:
(1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。
(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。
(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。
session的缺点:
第一、数据的存取效率不高。session在服务端是以文本文件的方式来保存数据。相对而言,从内存取数据要比从硬盘取数据肯定要快。
第二、无法对目前有效的session进行遍历。也就无法对当前所有连接到服务器上的客户端信息进行遍历,也就无法了解当前所有用户的统计信息,比如当前用户的在线人数。
Http中Cookie和Session介绍的更多相关文章
- flask中cookie和session介绍
flask中cookie和session介绍 一.cookie: 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.co ...
- flask中cookie和session设置
flask中cookie和session介绍 一.cookie: 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户. ...
- 在pycharm中批量插入表数据、分页原理、cookie和session介绍、django操作cookie
昨日内容回顾 ajax发送json格式数据 ''' 1. urlencoded 2. form-data 3. json ''' 1. ajax $.ajax({ data: JSON.stringi ...
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
浅谈JS中的!=.== .!==.===的用法和区别 var num = 1; var str = '1'; var test = 1; test == num //tr ...
- thinkphp中cookie和session中操作数组的方法
thinkphp中cookie和session中操作数组的方法 一.ThinkPHP模板中如何操作session,以及如果session中保存的是数组的情况 在ThinkPHP的模板中操作sessio ...
- PHP中Cookie与Session的异同以及使用
Cookie与Session的异同: 一.cookie机制 Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器.IETF RFC 2965 HTTP State Mana ...
- Java cookie和session介绍与区别
一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于才服务器端保持状态的 ...
- 关于缓存中Cookie,Session,Cache的使用
文章来源:http://canann.iteye.com/blog/1941173 以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application. 其中C ...
- web存储中cookie、session区别
http协议是一种无状态的协议,浏览器对服务器的每一次请求都是独立的.为了使得web能够产生一些动态信息,就需要保存”状态”,而cookie和session机制就是为了解决http协议无状态而产生.c ...
随机推荐
- MakeObjectInstance的简单理解
昨天把MakeObjectInstance的代码详细研究了一下,当然还有众多前辈高手们的帮助,终于大致搞明白了是怎么回事.但是给我顿悟的,不是高手们的帖子,而是来自我自己的一个疑惑,TObjectIn ...
- SQL语句 递归
--正向递归查询(根据ID查到自己和自己以下的所有数据) connect by prior a.id = a. parentid --反向递归查询(根据叶子ID查出自己和自己以上的根数据) ...
- 使用YUM管理软件包
一.概念 YUM,全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器 ...
- SQL Server 数据库初始化准备脚本
通常我们在项目部署前都会写一份数据库初始化脚本.由于数据库外键的限制,我们需要按照数据引用顺序添加初始记录,这个整理过程相当麻烦. 因此写了以下脚本,原理是先去掉所有外键,然后执行一次清空,然后添加数 ...
- @Factory和@DataProvider的区别
DataProvider: A test method that uses DataProvider will be executed a multiple number of times based ...
- Javascript上下文
var User = { count: 1, getCount: function() { return this.count; } }; console.log(User.getCount()); ...
- Support Library(4)ecliplse导入支援包的方法
准备工作 下载支援包到本地.在 <sdk>/android-sdks/extras/android/support/v7 下包含两个目录「 m2repository,support 」 ...
- 谈谈Perforce
实习就要结束了,收获之一就是学会了使用Perforce! Perforce SCM System是一款构建于可伸缩客户/服务器结构之上的软件配置管理工具.仅仅应用 TCP/IP,开发人员就能够通过多种 ...
- 运行时报错 ADB server didn’t ACK
查看进程中所有和ADB有关的进程,全都结束了,包括什么豌豆荚之类的(大多数情况是占用端口),之后重新启动Eclipse.
- java.lang.NoSuchMethodError: org.springframework.beans.factory.annotation.InjectionMetadata.<init>(Ljava/lang/Class;)V
相应我,是因为你SPRING MVC的包没有加全.你可以新建一个WEB项目.加入SPRING 3.0 的所有包.主要是WEB类的.就可以解决这个问题了.关键就是少包.特别是你的项目原来是SRPING ...