session、cookie与“记住个人登陆状态”的功能的实现

session、cookie与“记住个人登陆状态”的功能的实现

Cookie的机制php

Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能。程序员

Cookie的Domain和Path属性标识了这个Cookie是哪个网站发送给浏览器的;Cookie的Expires属性标识了Cookie的有 效时间,当Cookie的有效时间过了以后,这些数据就被自动删除了。数据库

若是不设置过时时间,则表示这个Cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,Cookie就消失了。这种生命期为浏览会话期的 Cookie被称为会话Cookie。会话Cookie通常不保存在硬盘上而是保存在内存里。若是设置了过时时间,浏览器就会把Cookie保存到硬盘 上,关闭后再次打开浏览器,这些Cookie依然有效直到超过设定的过时时间。存储在硬盘上的Cookie能够在不一样的浏览器进程间共享,好比两个IE窗 口。而对于保存在内存的Cookie,不一样的浏览器有不一样的处理方式。浏览器

Session的机制服务器

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

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

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

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

[1] 使用Cookie来保存,这是最多见的方法,本文“记住个人登陆状态”功能的实现正式基于这种方式的。服务器经过设置Cookie的方式将Session ID发送到浏览器。若是咱们不设置这个过时时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个Session ID就丢失了。若是咱们设置这个时间为若干天以后,那么这个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,而这个操做是发生在用户请求一个须要身份验证的页面资源的背后,对于用户来说是透明的,因而就达到了“记住个人登陆状态”的目的了。

到目前为止,已经基本明确了“记住个人登陆状态”的实现方式和理论依据,后文将使用jsp和php两种Web开发技术来具体实现这个功能。

相关文章
相关标签/搜索