cookie与session的实现
ps:本人亲测,阿里云2核4G5M的服务器性价比很高,新用户一块多一天,老用户三块多一天,最高可以买三年,感兴趣的可以戳一下:阿里云折扣服务器
Cookie
实现机制:
浏览器首次访问服务器,发送请求如果没有带身份,服务器检测不到cookie会返回一个登录窗口,输入用户名和密码后再次请求,服务器接受到表单提交上来的用户信息后验证通过,返回一个相应的请求页,并在HTTP头中添加setcookie信息,浏览器接受到返回内容后会处理http头部的相应信息,这里会设置cookie,第二次用户访问服务器时会浏览器会自动把cookie内容读取出来并加到http头部,服务器接受请求后验证提交过来的cookies是否正确,正确直接就返回相应的页面,不正确则返回登录页面。
Cookie的分类:
根据存放的位置可以分为持久化的cookie和临时cookie;持久化cookies就是会存放在%userprofile%/cookies目录下的文本文件;临时cookie是存放在内存中的cookie,又成session cookie或进程cookie。
作用域:
cookie的作用域是根据域名和路径来决定的,域名和路径限制的越小,其作用域就越小。如.sina.com.cn >sina.com.cn>sina.com.cn/news/。第一个是所有以sina.com.cn为基础域名的网页都可以用;第二个只有www.sina.com.cn域名的页面及子路径下的页面可以用;第三个只有www.sina.com.cn/news/下的网页可以用。
另临时cookie的作用域和session一样,只有当前浏览器及其子窗口可以共享。
有效期:
cookie的有效期有3种状态:大于0的数值为相应的有效期的时长;等于0相当与做了一个删除操作;小于0就是说不生成持久化cookie,只是临时的。
浏览器处理流程:
浏览器对cookie首先有限制,比如IE对cookie总数有限制(300个),另外另外每个cookie文件的cookie数有限制(50个),单个cookie文件的大小有限制(4K),当cookie数达到上限时就会删除前面的cookie,IE的处理方式是最近最少使用的原则。此外浏览器在接受到http头中的cookie设置标识后会在相应目录下生产cookie文件,文件名为user@domain【index】形式,这是浏览器自动生成的,user为系统当前用户名,domain为访问页面的域名,index应该是cookie的修改次数,而且当前打开的页面所携带的cookie一定是index最大的cookie文件里的内容。
多cookie:
一个页面只对应一个cookie文件,一个cookie文件里可以保存若干个cookie,每个cookie有自己的有效期、作用域等,所以一个页面可以对应多个cookie,除此之外还包括内存里的临时cookie;但是一个cookie文件可以对应多个页面,但是这些页面都是同一个主域名下的。
Session
实现机制:
session是浏览器访问了服务器通过验证后,服务器发给浏览器的一个身份凭证,并且服务器自己也保存一个一样的ID序列;在下次浏览器访问的时候会来上session的信息,服务器端会坚持session的值在服务器端有没有保存,有保存说明此用户以通过了验证就直接返回请求的页面,并且对提交的数据依据此sessionID进行相应处理;如没有找到相同的session的值,则说明此session可能失效,或是无效的,服务器会重新验证身份并发送一个新的sessionID。
实现方式:
session通常有2种方式去实现:一种就是上面提到的session cookie,把服务器把sessionID作为cookie的内容保存在内存中,就是所谓的临时cookie中,每次请求都以cookie的形式传给服务器;另一种是在浏览器cookie被禁用的情况下如何实现sessionID的提交,当服务器检测到cookie被禁用后,服务器在返回相应页面之前对原先的URL 进行一次重编码,把sessionID的值连接到URL后面,下次浏览器请求时sessionID就以get方式传给了服务器,服务器接受后进行相关验证和处理。
作用域:
session的作用域可以看作是和浏览器进程想关联,只有当前页面及其子页面【继承页面】可以公用一个sessionID,跨浏览器和跨域名都不能公用一个sessionID。因此同时用2个浏览器访问同一个地址时会返回2个不同的sessionID。
有效期:
session的有效期就是通过验证的浏览器进程的生命周期,进程结束后内存被释放,session自然就没有了,此时在服务器端的sessionID还没有删除【如果是URL方式传送session的话,不知道在关了浏览器后重新用之前带有session的URL访问,会有成功么?】;另一种情况是浏览器没有关,但是已经长时间没有和服务器交互了,并且服务器端检测到这个sessionID在规定范围内没有请求动作,就会认为是一个过期的sessionID,直接在服务器端给删除了,这种失效与服务器配置有关。
浏览器处理流程:
浏览器处理session的过程其实就是处理临时cookie的过程,当浏览器接受到临时cookie时,直接保存在浏览器对应页面的内存中,下次请求时再直接附带上就O了。
多Session:
多个session同时存在很简单,直接起多个单独的浏览器,访问服务器就行了。各session间也不会有影响的,否则做并发测试时就很头疼了。