Cookie、Session实现“记住登录状态”的原理

  进行自动化测试时,发现公司中所有的功能测试用例必须基于一个前提:用户已登录的情况下才能测试。基于这种情况,有2种解决方案:1)为所有的testcase添加testng中依赖关系,使其依赖于“登录”这一条用例执行;2)利用网页的cookie记住登录状态,无需再执行一遍登录的测试用例。

  在设计测试用例时,有一条原则,就是每个testcase之间尽可能是相互独立的,不要存在过多的依赖关系。遵循这条原则,我们选择使用第二种方法,来解决上述问题。本文主要阐述了cookie、session记住登录状态的实现原理,方便我们更好地写测试用例。

Cookie的机制

  在网站中,http请求是无状态的也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题:当浏览器访问网站后,这些网站将一组数据存放在客户端,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动携带给服务器,服务器通过浏览器携带的数据就能识别当前用户

  cookieDomain和Path属性标识了这个Cookie是哪一个网站发送给浏览器的;Expires属性标识了cookie的有效时间

    1)如果对Expires属性进行有效时间设置,cookie的有效时间过了之后,这些数据就被自动删除了此时会话cookie保存在硬盘上。关闭浏览器后再次打开,这些cookie依然有效直到超过设定的有效时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗 口。

    2)如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。

  特点:cookie存储在本地浏览器,且存储数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。

Session的机制

  Session是存放在服务器端的类似于HashTable结构(每一种Web开发技术的实现可能不一样,下文直接称之为HashTable)来存放用户 数据,当浏览器第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。

  一般情况下,服务器会在一定时间内(默认20分钟)保存这个HashTable,过了时间限制,就会销毁这个HashTable。在销毁之前,程序员可以 将用户的一些数据以Key和Value的形式暂时存放在这个HashTable中。当然,也有使用数据库将这个HashTable序列化后保存起来的,这 样的好处是没了时间的限制,坏处是随着时间的增加,这个数据库会急速膨胀,特别是访问量增加的时候。一般还是采取前一种方式,以减轻服务器压力。

  总而言之,session和cookie的作用类似,都是为了存储用户相关的信息。

  特点:cookie存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但会占用服务器的资源

Session的客户端实现形式(即Session ID的保存方法)

  一般浏览器提供了两种方式来保存,还有一种是程序员使用HTML隐藏域的方式自定义实现:

    1) 使用cookie来保存这是最常见的方法,本文“记住我的登录状态”功能的实现就是基于这种方式的。服务器通过设置cookie的方式将Session ID发送到浏览器。

      a.如果我们不设置有效时间,这个cookie将存放在内存中成为一个和浏览器共存亡的会话cookie。当浏览器关闭的时候,cookie消失对应的Session ID就丢失了

      b.如果我们设置这个时间为若干天之后,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同样会发送到服务器上。

    2) 使用URL附加信息的方式也就是像我们经常看到JSP网站会有aaa.jsp?JSESSIONID=*一样的。这种方式和第一种方式里面不设置cookie过期时间是一样的。

    3) 第三种方式是在页面表单里面增加隐藏域,这种方式实际上和第二种方式一样,只不过前者通过GET方式发送数据,后者使用POST方式发送数据。但是明显后者比较麻烦。

实现“记住我的登录状态”的功能

  前面我们了解到,如果我们将Session ID通过Cookie发送到客户端的时候设置其有效时间为1年,那么在今后的一年时间内,客户端访问我的网站的时候都回将这个Session ID值发送到服务器上,服务器根据这个Session ID从内存或者数据库里面恢复存放Key-Value对的Hashtable。

  但是,实际上Session并不会一直存在过了一定的时间之后,服务器上的Session就被销毁,以减轻服务器的访问压力。当服务器上的数据被销毁后,即使客户端上存放了cookie也没有办法“记住我的登录状态”了。

  通用的实现办法是,将用户的用户名和加密之后的密码也通过cookie的方式存放在客户端,当服务器上的Session销毁以后,使用cookie里面存 放的用户名和加密之后的密码重新执行一次登录操作,重建Session,并更新客户端上cookie中存放的的Session ID,而这个操作是发生在用户请求一个需要身份验证的页面资源的背后,对于用户来讲是透明的,于是就达到了“记住我的登录状态”的目的了。

 

  具体如何使用上文的方法,在Selenium + testng + java中实现记住登录状态,将在下一篇文章中详细描述。

原文地址:https://www.cnblogs.com/May-study/p/9790745.html