参考:https://www.cnblogs.com/lonelydreamer/p/6169469.html
cookie和session出现的原因
其实它俩之所以出现,就是为了解决HTTP协议无状态的缺陷的。HTTP协议本身是无状态的,这和它本来存在的目的是一样的,因为客户端每次只需要在服务器上下载某些文件,客户端和服务器并没有太大的意义去记录彼此过去的行为,但是人总是爱偷懒的嘛,作为用户,如果每次访问同一个服务器的时候,我们对于一些相同的信息,就好像我们的登录信息,记住密码总比我们每次都重新输入的好,因此cookie和session也就顺势而生了
稍微理解下cookie机制
其实对于cookie机制和session机制的基本原理,我参考文献的大佬所举的喝咖啡例子就特别生动形象加具,对于咖啡店搞优惠活动喝5杯送一杯,记录顾客的消费数量就有以下几种方案:
1、牛逼的店员,可以记住每个顾客消费的数量,这种做法类似于协议本身支持状态
2、每个顾客来消费时,给顾客一张卡片,卡片上面记录着顾客消费的数量,还有有效期,每次消费,顾客就出示这张卡片,店员就知道顾客原来的消费情况,也就会给顾客相应的服务。这种做法就类似于cookie机制,让客户端保持状态。
3、给顾客一张会员卡,顾客每次消费出示这张会员卡,店员就在店里面的记录本或者记录系统上添加上顾客的消费信息。这种做法就类似于session机制,让服务器端保持状态。
cookie机制的原理就和第二种情况一样,但是它还有几个具体的内容需要了解,cookie如何分发,cookie的内容是啥,浏览器如何使用cookie。
首先说一下cookie的分发,一般都是通过扩展HTTP协议来完成,在HTTP响应头中加上一行特殊的指示,来告诉浏览器生成响应的cookie,但有的一些客户端脚本也会生成cookie。
cookie的内容主要分为五部分:名字,值,过期时间,路径和域
过期时间:不设置的时候,该cookie的生命周期就是浏览器的会话时间,就是从创建它起到浏览器关闭的这段时间,浏览器关闭,cookie消失,这种cookie被称为会话cookie,它存储在内存上,而对于设置了过期时间的cookie,它就会一直有效,知道超过了过期时间,即使浏览器关闭,因此它是存储到磁盘上的。
域:指定一个域或者域下的一个具体的机器,就好像.baidu.com或者www.baidu.com。
路径:路径是跟在域和面的URL路径,路径和域共同构成了cookie的作用范围
cookie的使用时浏览器按照一定的原则在后台自动发送给服务器,浏览器检查所有的存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
对于cookie来说有一种cookie是存在很大问题的,那就是会话cookie,因为对于存储在磁盘上的cookie,不同浏览器都是共享的,而对于存储在内存上的cookie,不同的浏览器有可能会有不同的处理方式,这就体现了会话cookie只认cookie不认人的行为处理方式,这种行为往往对于采用了session机制的Web服务程序开发人员带来很大的困扰,因为session id一般都是通过cookie保存的。
再稍微了解下session机制
session机制就和上面咖啡优惠方案的第三种一样,客户只需要有一张会员卡,其他的都由店员来操作,对于客户端来说,它只需要发送请求的时候多一个session id字段就可以了,当他把session id发给了服务器端,其他的的事情都由服务器来完成,如果客户端的请求中没有session id,服务器就会像店铺给新来的顾客发放会员卡一样,创建一个session,然后将session id返回给客户端。这里面又牵扯到一个session id,它是用来标识一个session的,因此它的的值都是不重复,并且不容易找到规律被仿造等字符串。
session id最终是会被传回给服务器的,它由客户端传回给服务器的方式大致有三种:cookie,URL重写,创建单表隐藏字段
客户端使用cookie来保存session id利于客户端和服务器进行交互时自动的按照规则将这个session id发送服务器,但是cookie可以被人为的禁止,虽然这种行为很少出现,因此又出现了另外一种存储session id的方法就是重写URL
重写URL就是直接将session id附加到URL的后面,附加方式又有两种,第一种方式将是将session id作为URL的附加信息,另一种是将session id作为查询字符串附加在URL后面,举个例子就像http://…/x/;jsessionid=ASDFJADSLKFJOIEJ32425432532598UJ-234234和http://…/x?jsessinid=ASDFJADSLKFJOIEJ32425432532598UJ-234234这两种一样,第一个对应第一种,第二个对应第二种。
第三种保存session id的方式是一个很老,目前也使用特别少的方法,就是设置表单隐藏字段,服务器自动修改表单,添加一个隐藏字段,这样就可以使表单提交时能够把session id传递回服务器。
对于这三种保存session id的方式,最常用的就是用cookie这种方式了,因为这种方式利于把session id的信息和正常程序参数区分开来。
关于session机制的一个误解:只要关闭了浏览器,session id就消失了。
之所有会有这种误解,就是因为session id一般都是通过会话cookie方式保存的,所以浏览器关闭,会话cookie就会消失,从而会被认为session也消失了。session要被删除只能由服务器程序对其进行删除,因此关闭浏览器该客户端对应的session并不会被删除,但是客户单确实已经断开了,这个session就变的没有意义还占存储空间了,因此服务器会给session设置一个失效时间,当客户端距离上一次使用这个session的时间超过了这个失效时间,服务器就会将session给删除掉以节省存储空间。
cookie和session机制之间的区别
其实我们通过理解cookie机制和session机制,关于他们的区别,我们只需要粗略的记住一点,cookie对应客户端,session对应服务器。