从实现作用的角度去理解Session与Cookie

HTTP协议的不足:

HTTP是一种无状态、无连接协议。无状态是指协议对于事务处理没有记忆能力,无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。对HTTP服务器来说,它并不知道两个请求来自同一个客户端,也不知道用一个用户前后两次请求之间的关系,如果后续处理需要前面的信息,客户端必须重新发送数据。这种设定虽然能够实现高效快速地连接,但同时也给浏览器前的用户带了了很不好的体验。


为了弥补HTTP协议的不足:

于是后来出现了Session和Cookie两种技术来弥补HTTP协议这方面的不足,使浏览器和服务器能够在无状态、无连接的HTTP协议下依然能够保持会话。Cookie技术是客户端的解决方案。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。


Cookie机制

简单来说,Cookie的工作机制如下:浏览器第一次通过填写登录信息进入某网站后,服务器会根据服务器设定,在这次请求(Request)的响应(Response)中添加一个Cookie对象并回传给浏览器(response.addCookie()),对象中包含了用户登录时输入给服务器的信息。浏览器在收到服务器的响应以后,就会把相应中的Cookie对象写入到本地的Cookie文件中。当浏览器关闭后再次访问该网站时,会通过Request的头部把Cookie中的内容发送给服务器。如此,即使用户在第二次访问网站时没有输入任何登录信息,服务器也可以获取并验证用户的身份和信息,从而自动进行页面显示的处理。
由于Cookie是客户端的解决方案,所以很多人会产生一个误解,认为是浏览器在处理Cookie中的主要事务。其实并非如此。在Cookie的运行机制中,浏览器和本地硬盘只是起到了存储和发送Cookie中键值对的功能。真正对Cookie起控制作用的依然是服务器。服务器决定了哪些信息可以写入Cookie,哪些不可以;服务器决定了是否删除和修改本地的Cookie文件,而不是浏览器自己决定;服务器决定了某个Cookie的有效期限,而不是浏览器本身决定的。


Session机制
Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。
简单来说,Session的工作机制如下:当用户通过浏览器第一次登录某个网站时,服务器会自动为这次访问创建一个session,并生成唯一的Sessionid(由此我们知道,一个Session必然是对应一个独一无二用户的)。在服务器的配置文件中设置了这个Session的有效期,一般是30分钟。通过服务器端的设置,可以在Session中存入用户的个人信息。由于Sesion在服务器端是跨页面的,因此Session中写入数据以后,在他的有效期内,整个网站都可以读取到这段数据。这样就实现了用户一次登录后,就可以自由访问网站的所有内容的功能了。
这里有个小细节需要注意:
因为HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器第一次相应客户端时,会在响应头中中添加一个名为JSESSIONID的Cookie。当同一浏览器再次请求服务器时就会在请求头中携带此Cookie。而服务器则通过对比此cookie中的SessionID与本地内存中的SessionID来判断此次请求是否来自同一用户。这一系列操作都是服务器自动完成的,不需要开发人员和用户的参与。另外,服务器自动生成的这条关于SessionID的Cookie,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此,虽然Session和Cookie本质是两种不同的保持会话的机制,但Session机制的实现是有赖于Cookie的支持的,如果浏览器关闭了Cookie,就会导致Session也不可用。


总结Session和Cookie的联系与区别
相同点:
二者都是为了弥补HTTP协议的不足,通过增加额外的存储空间来使浏览器和服务器之间能够在无状态、无连接的HTTP协议下依然能够保持会话。
区别:
cookie数据存放在客户的浏览器上,session数据放在服务器上;
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;

猜你喜欢

转载自blog.csdn.net/illikang/article/details/82693681
今日推荐