Session和Cookie之间到底有什么联系和区别,首先得从HTTP说起。
HTTP协议
HTTP是无状态协议,客户端连接服务端,发出一个HTTP Request,服务端处理请求,并且返回一个HTTP Response给客户端,至此本次HTTP Request-Response Cycle结束。每提交一个HTTP请求,服务器都打开新的会话,服务器不会自动维护客户的上下文信息。下次再请求时它并不会记住你。那么,服务器如何识别用户呢?肯定要有一定的方法,于是,session和cookie这类保存上下文信息的机制就出现了。
cookie
首先看看cookie,个人认为比较通俗易懂的一种解释是:cookie是当你浏览某网站时,由Web服务器放在你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页等信息。当你再次来到该网站时,网站通过读取Cookies,得到你的相关信息,就可以做出相应的动作,如让你不用输入ID、密码就直接登录等。从本质上讲,它可以看作是你的×××。目前大多提供个性化服务的网站都使用了cookie。
session
什么又是session呢? 简单来说就是服务器给客户端的一个编号。当一台服务器运行时,可能有若干个用户浏览这台服务器上的网站。当用户首次与服务器建立连接时,他就与这个服务器建立了一个session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在 HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端。这个SessionID就是保存在客户端的,属于客户端Session。
注意:sessionID有两种保存方式,常用方式是以cookie的形式保存。那么,禁用了cookie怎么办呢?禁用cookie后,sessionID会直接附加在URL后面。
cookie和session的区别:
貌似两者都是用于标识用户,都是×××,他们之前是等同的吗?答案是否定的。
一、两者的存在方式不同。
cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。什么意思?有一个很形象的例子,一家咖啡店有喝5杯咖啡免费赠一杯的优惠,需要某种方式来纪录某位顾客的消费数量。有几种方案如下:
1、由店员记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么处理。这种做法就是协议本身支持状态,而HTTP协议是不能达到此目的的。
2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费联系起来。这种做法就是在客户端保持状态,即cookie。
3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态,即session。
但是,就像上述第三种情况中,顾客也知道自己的会员卡号,因此,采用服务器端保持状态的方案在客户端也需要保存一个标识,即sessioID,通常通过cookie保存,就是常说的session cookie。
二、两者的生命周期不同。
cookie存在于文件中,可修改其存活时间。
session存在于内存中,浏览器关闭它就“死”了。
cookie和session在loadrunner上的使用:
Session:
不同的用户发送请求时服务器会随机生成不同的sessionID,而在使用loadrunner录制时它会把这个sessionID写死,导致出错,解决方法是使用关联函数,使不同用户的请求关联到不同的sessionID。
下面举例说明如何使用关联函数:
1、若提交一个请求后,服务器端返回的响应如下:
Set-Cookie: JSESSIONID=325909BD2AEEE86E2A1EBA7C91B7F769; Path=/
2、要使每次请求时生成不同的sessionID,需要在请求前面添加如下函数:
web_reg_save_param(“jsession”,
“LB=Set-Cookie: JSESSIONID=”,
“RB=; “,
LAST);
(其中jsession 为参数名,LB为左边界,RB为右边界,指定左边界和右边界后, loadrunner将搜索这些边界之间的文本,找到文本后,会将其分配给某个参数,即jsession)
3、使用web_add_cookie函数添加每次请求的不同的jsessionid。
web_add_cookie(“JSESSIONID={jsession};path=/;domain=www.360buy.com”);
(其中domain指定cookie被发送到哪台计算机上。正常情况下,cookie只被送回最初向用户发送cookie 的计算机。Path是cookie的适应范围,指明该cookie在什么路径起作用)
至此大功告成,每次请求都是一个全新的sessionid。
Cookie:
关键点:web_add_cookie函数
有时登录操作并不是测试压力点,而登录本身是一件很耗费资源的工作,如何跳过登录?
1、录制一次登录过程,将过程中生成的cookie使用web_add_cookie函数进行cookie的添加。
2、将第一步添加的cookie加到init()函数里,这样在整个过程中只执行一次,至此可以绕过登录,只关注压力点。