静态页面和动态页面
静态页面:整个页面的内容完全来自自身文件,页面没有与后台有任何交互。
动态页面:页面通过js调用后台数据库和文件数据提取到前端显示,前端内容根据后台内容变化而变化。
HTTP是无状态的
HTTP的特性是无状态,即HTTP向服务器发送请求,服务器返回请求后,服务端与客户端的连接中断并不会持续保持与客户端的连接状态。
会话
客户端与服务端通信的过程,可以理解为客户端发送请求服务端接受并返回请求后断开的整个过程。
Cookies
-
会话持续
由于HTTP协议无状态的特性,想要实现登陆就必须每一次请求都重新登陆一次,这样肯定是不行的。为了解决这个问题Cookies诞生了,客户端登陆服务端之后服务端会生成一段名叫Cookie的字符串,通过相应头中的Set-Cookie方法将Cookie字段配置给客户端。客户端再次请求服务端的时候在请求头中带上Cookie字符串,服务端会验证客户端的发来的Cookie状态,与服务器中的数据对比,查看是否为登陆状态,如果状态为登陆则允许进行登陆后的操作,如果非登陆则返回错误。 -
Cookie结构
谷歌浏览器的开发者模式中Alication选项卡,左侧Storage>Cookies可以查看网站的Cookie信息,其中属性包括:
Name:该Cookie的名称,一旦创建,该名称便不可更改;
Value:该Cookie的值,如果值为Unicode字符,需要为字符编码,如果值为二进制数据,则需要使用BASE64编码;
Domain:可以访问该Cookie的域名,例如,如果设置为.zhihu.com,则所有以zhihu.com结尾的域名都可以访问该Cookie;
Max Age/Expires:该Cookie失效的时间,单位为秒,也场合Expires一起使用,通过它可以计算出其有效时间。Max Age如果为正数,则该Cookie在Max Age秒之后失效,如果为负数,则关闭浏览器时Cookie即失效,浏览器也不会以任何形式保存该Cookie。
Path:该Cookie的使用路径,如果配置为/path/,则只有路径为/path/的也米娜可以访问该Cookie,如果设置为/,则本域名下的所有页面都可以访问Cookie。
Size字段:表示Cookie的大小
HTTP字段:Cookie的httponly属性,若此属性为true,则只有在HTTP头中会带有此Cookie的信息,而不能通过document.cookie来访问Cookie。
Secure:该Cookie是否仅被似乎用安全协议传输。安全协议有HTTPS和SSL,在网络上传输数据之前将数据加密,默认为false。
会话Cookie和持久Cookie:
会话Cookie,访问完成Cookie失效;
持久Cookie,再次访问Cookie依然有效。
区别会话Cookie和持久Cookie关键在于Max Age参数,参数的大小影响会话持续时间。
Session
Session,即会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 Session。
而在 Web 中 Session 对象用来存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。
Session和Cookies的不同是,Cookies保存在客户端,Session保存在服务端。
常见误区
在谈论 Session 机制的时候,常常听到这样一种误解“只要关闭浏览器,Session 就消失了”,这种理解是错误的,可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对 Session 来说也是一样的,除非程序通知服务器删除一个 Session,否则服务器会一直保留,比如程序一般都是在我们做注销操作的时候才去删除 Session。
但是当我们关闭浏览器时,浏览器不会主动在关闭之前通知服务器它将要关闭,所以服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分 Session 机制都使用会话 Cookie 来保存 Session ID 信息,而关闭浏览器后 Cookies 就消失了,再次连接服务器时也就无法找到原来的 Session。如果服务器设置的 Cookies 被保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP 请求头,把原来的 Cookies 发送给服务器,则再次打开浏览器仍然能够找到原来的 Session ID,依旧还是可以保持登录状态的。
而且恰恰是由于关闭浏览器不会导致 Session 被删除,这就需要服务器为 Seesion 设置一个失效时间,当距离客户端上一次使用 Session 的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把 Session 删除以节省存储空间。