我们通常说的是浏览器自动保存密码,下次不用登录,更换网页皮肤,引导用户,提示一次没出现的内容。大部分内容是通过cookies或者session实现的。在这个用户指南的制作中,我使用了cookies的内容。由于之前没有详细了解,本文将深入讲解两者的区别和应用。如果你正在寻找如何设置、使用和删除cookie,你可以阅读我的下一篇文章:使用js(带换肤应用)设置、读取和删除cookie的最佳代码
饼干的概念
Cookie是浏览器(用户代理)访问一些网站后,存储在这些网站客户端的一组数据,用来让网站跟踪用户,实现用户自定义的功能。Cookie的域和路径属性标识哪个网站向浏览器发送了此Cookie;Cookie的expiration属性标识Cookie的有效时间。当Cookie的有效时间过去后,数据将被自动删除。如果您没有设置过期时间,这意味着Cookie的生命周期是在浏览器会话期间。只要关闭浏览器窗口,Cookie就会消失。这种生存期为浏览会话的Cookie称为会话Cookie。会话Cookie通常存储在内存中,而不是硬盘中。如果设置了过期时间,浏览器会将cookies保存到硬盘上。关闭后,再次打开浏览器,这些cookies将保持有效,直到超过设定的过期时间。存储在硬盘上的Cookie可以在不同的浏览器进程之间共享,比如两个ie窗口。对于存储在内存中的Cookie,不同的浏览器有不同的处理方式。
会话的概念
Session是一种存储在服务器端的类似哈希表的结构(每种Web开发技术的实现可能不同,以下直接称为哈希表)来存储用户数据。当浏览器第一次发送请求时,服务器会自动生成一个哈希表和一个会话ID来唯一地标识这个哈希表,并通过响应将其发送给浏览器。当浏览器第二次发送请求时,它会将会话ID放在请求中的前一个服务器响应中,并发送给服务器。服务器从请求中提取会话ID,并将其与所有保存的会话ID进行比较,以找到与该用户对应的哈希表。一般情况下,服务器会保存这个哈希表一定的时间(默认20分钟),超过这个时间限制,就会销毁这个哈希表。在被销毁之前,程序员可以将用户的一些数据以键和值的形式临时存储在这个哈希表中。当然,还有使用数据库来序列化这个哈希表并保存它。这样做的好处是没有时间限制。缺点是随着时间的增加,这个数据库会迅速膨胀,尤其是当访问量增加的时候。一般采用前一种方法来减轻服务器的压力。Session的客户端实现形式(即Session ID的保存方法)一般浏览器提供两种保存方式,另一种方式是程序员使用HTML隐藏字段自定义实现:[1] Cookie用于保存,这是最常用的方法。本文中“记住我的登录状态”功能的实现正式基于这种方式。服务器通过设置Cookie将会话ID发送给浏览器。如果我们不设置这个过期时间,那么这个Cookie将不会存储在硬盘上。当浏览器关闭时,Cookie将消失,该会话ID也将丢失。如果我们将这个时间设置为几天后,那么这个Cookie就会保存在客户端的硬盘上。即使关闭浏览器,这个值仍然存在,下次访问相应的网站时,相同的样本将被发送到服务器。【2】使用URL附加信息的方式,也就是我们经常看到的,JSP网站会有aaa.jsp?JSESSIONID=*相同。这种方法与第一种方法相同,第一种方法没有设置Cookie过期时间。[3]第三种方法是在页面表单中添加隐藏字段。这种方式其实和第二种方式一样,只是前者通过GET发送数据,后者通过POST发送数据。但显然后者更麻烦。
与cookie会话的区别:
Cookie数据存储在客户机中,会话数据存储在服务器中。简单来说,当你登录一个网站,如果web服务器使用session,所有的数据都会保存在服务器上。每次客户端请求服务器时,它都会发送当前会话的sessionid。服务器会根据当前的sessionid来判断对应的用户数据标志,以确定用户是否登录或具有一定的权限。因为数据是存储在服务器上的,所以你无法伪造,但是如果你能得到一个登录用户的sessionid,用专门的浏览器伪造用户的请求也可以成功。当服务器和客户端链接时,Sessionid是随机分配的。一般来说没有重复,但是如果有大量的并发请求,也不是没有重复的可能。我遇到过一次。当你登录一个网站,你开始显示你自己的信息。超时一段时间后,刷新时其实可以显示别人的信息。如果浏览器使用cookies,所有数据都将保存在浏览器端。例如,在您登录后,服务器会设置cookie用户名。然后当你再次请求服务器时,浏览器会把用户名发送给服务器,这些变量都有一定的特殊标记。服务器被解释为一个cookie变量。所以只要不关闭浏览器,cookie变量就一直有效,这样就可以保证不会长时间断网。如果你可以拦截一个用户的cookie变量,然后伪造一个数据包发送出去,那么服务器仍然认为你是合法的。因此,cookie被攻击的可能性更大。如果设置了的有效时间,则它会将cookie保存在客户端的硬盘上。下次访问网站时,浏览器会先检查是否有cookie。如果有,它将读取cookie,然后将其发送到服务器。如果你在你的机器上保存了一个论坛cookie,它的有效期为一年。如果有人入侵了你的机器,***了你的cookie放在他浏览器的目录下,那么他登录网站就是以你的身份登录的。所以饼干是可以伪造的。当然,锻造的时候,你需要一个想法。浏览器不会通过将cookie文件直接***到cookie目录来识别它。他有一个index.dat文件,存储了cookie文件的建立时间,以及是否被修改过。所以你必须先有这个网站的cookie文件,从保证的时间来说你要骗过浏览器。有一次,你在学校的vbb论坛上做了一个实验,***别人的cookie登录,用别人的名字发帖。一点问题都没有。会话是由应用服务器维护的服务器端存储空。当用户连接到服务器时,服务器将生成一个唯一的SessionID,它将用作访问服务器端会话存储空的标识符。而SessionID数据保存到客户端,由Cookie保存。当用户提交页面时,SessionID将被提交给服务器以访问会话数据。这个过程不需要开发者的介入。因此,一旦客户端禁用Cookie,会话也将无效。服务器还可以通过URL重写来传递SessionID的值,所以不完全依赖Cookie。如果客户端Cookie被禁用,服务器可以通过重写URL来自动保存会话值,这个过程对程序员是透明的。可以试试,就算不写Cookie,也是在用request . get cookies();取出来的Cookie数组长度也是1,这个Cookie的名字是jsSessionID,有一个很长的二进制字符串,就是SessionID的值。
本文来自弑魂战神投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/592671.html