zoukankan      html  css  js  c++  java
  • 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进行遍历。也就无法对当前所有连接到服务器上的客户端信息进行遍历,也就无法了解当前所有用户的统计信息,比如当前用户的在线人数。

  • 相关阅读:
    BZOJ 1191 HNOI2006 超级英雄hero
    BZOJ 2442 Usaco2011 Open 修建草坪
    BZOJ 1812 IOI 2005 riv
    OJ 1159 holiday
    BZOJ 1491 NOI 2007 社交网络
    NOIP2014 D1 T3
    BZOJ 2423 HAOI 2010 最长公共子序列
    LCA模板
    NOIP 2015 D1T2信息传递
    数据结构
  • 原文地址:https://www.cnblogs.com/dvbbs2012/p/5075973.html
Copyright © 2011-2022 走看看