前言
在ASP.net中都会提到cookie和session,而且都是状态保持机制,那么如何理解这个状态保持机制呢,接下来将会将我自己的理解总结下来。
从状态保持机制这几个词来看并不难理解,其实状态保持从字面意思来讲就是记录某一时刻的状态,那么如何才能体现这个机制呢,其实最容易理解的就是我们登录某个APP将自己的账号密码记住,在下一次登录的时候不用再次输入。还是就是我们逛淘宝或者浏览以下网页,也应用到了cookie和session。
既然都用到了这两机制,肯定都有各自的功能和职能,以及应用场景和优缺点,接下来请让一一道来。
一、产生
HTTP的无状态性:
HTTP 是一种不保存状态,无状态(stateless)协议。HTTP 协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理。使用 HTTP 协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。
随着 Web 的不断发展,无状态而导致业务处理变得棘手的情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了能够掌握是谁送出的请求,需要保存用户的状态。
HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管理状态了。
二、Cookie
1.什么是cookie
Cookies就是服务器暂存放在你的电脑里的资料(.txt格式的文本文件),好让服务器用来辨认你的计算机。当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,Cookies 会帮你在网站上所打的文字或是一些选择都记录下来。当下次你再访问同一个网站,Web服务器会先看看有没有它上次留下的Cookies资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你。简单来说Cookie是一段不超过4KB的小型文本数据,由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。
2、功能
cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据。
3.存储方式
cookie有两种存储方式,根据不同的设置或者需求采用不同的存储方式
①浏览器:我们常见的方式是将cookie存放在浏览器,也就是用户自己的浏览器,当浏览器关闭时cookie数据随着消失,为什么会消失呢?这里就要用到系统的任务了,在浏览器关闭以后操作系统就行内存回收,会将cookie的数据删除,释放内存。
②磁盘:指存储在用户的磁盘,而且能支持永久存储,但是这需要自己设置存储时间,也就是过期时间。只要你在设置的时间内打开此浏览器,那么自己设置的时间会自动延续。
4、优点:极高的扩展性和可用性
①数据持久性
②不需要任何服务器资源,因为cookie是存储在客户端并发送给服务器读取
③可配置到期规则,控制cookie的生命周期,使之不会永远有效,偷盗者可能拿到的是一个过期的cookie
④简单性,基于文件的轻量结构
⑤通过良好的编程,控制保存在cookie中的Session对象的大小
⑥通过加密和安全传输技术(ssl),减少cookie被破解的可能性
⑦只要cookie中不存放敏感的数据,即使被盗也不会有重大损失
5.缺点:
① cookie的数量和长度都有限
数量:cookie的数量有限
- IE6及以下的版本最多20个cookie
- IE7以后的可以有50个cookie
- Firefox可以有50个cookie
- chrome和safri没有限制
长度:每个cookie的长度不超过4k,否则会被截掉
②潜在的安全风险:cookie可能被截取篡改,如果cookie被拦截,就可能会获取到所有的Session信息
③用户配置为禁用,有的用户禁用了浏览器或者客户端设备接受cookie的能力,因此限制了这一功能
④有些状态不可能保存在客户端,例如,为了防止重复提交表达,需要在服务器端保存一个计时器,如果把这个计时器保存在客户端,它将不起作用。
三、Session
1、什么是Session
Session直接翻译成中文比较困难,一般都译成时域。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。
需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器建立连接时所处的Session是两个不同的Session。就是每个用户都有一个独立的Session。
2.存储方式
服务端
3、功能
其实Session就是一个容器,当用户浏览网页或者用自己账号登录APP的时候将信息存存储在服务端也就是服务器,在服务器中会为每个用户创建一个空间,用户存放Session数据。每个用户会有一个唯一的ID。跟cookie不同的是cookie存放在浏览器也就是用户端,而Session存储在服务器端。
4、优点
① 基于数据库的Session共享(服务器出现问题,session不会丢失。)
②基于NFS共享文件系统
③基于memcached 的session
④基于resin/tomcat web容器本身的session复制机制
⑤基于TT/Redis 或 jbosscache 进行 session 共享。
⑥基于cookie 进行session共享
5、缺点
①如果网站的访问量很大,把session存储到数据库中,会对数据库造成很大压力,还需要增加额外的开销维护数据库。
②session过期后可以实现自动清除,必须自己设定回收机制,我们可以利用crontab来定期回收。
用以下shell命令即可:find /tmp/php_sess -mmin +30 | xargs rm -fr
③在机器较少,网络流量较小广播式复制到其余机器上,当机器数量增多时候会有一定廷时,带来一定网络开销
④受制于Memcache的容量(除非你有足够内存存储),如果用户量突然增多cache由于容量的限制会将一些数据挤出缓存,另外memcache故障或重启session会完全丢失掉。所以更偏向于redis。
四、对比
1.session其实指的就是访问者从到达某个特定主页到离开为止的那段时间。 Session其实是利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了。
注:为这个用户创建的Cookie的名称是aspsessionid。这个Cookie的唯一目的就是为每一个用户提供不同的身份认证。
2.cookie和session的共同之处在于:cookie和session都是用来跟踪浏览器用户身份的会话方式。
3.cookie 和session的区别是:cookie数据保存在客户端,session数据保存在服务器端。
简单的说,当你登录一个网站的时候。
注:初学者,有些来自网络,总结有误的地方还请大佬见谅,指出。