对于需要登录的情况,有些页面只有登录后才可以访问,而且登录之后可以连续访问很多次网站,但有时候过一段时间就会需要重新登录。还有些网站在打开浏览器时就自动登录了,而且很长时间都不会失效。这里面涉及到的就是Session和Cookies的相关知识。
1.静态网页和动态网页
网页内容是HTML代码编写的,文字、图片等内容军事通过写好的HTML代码来指定的,这种页面叫做静态网页。
这种网页加载速度快,编写简单,但存在很大的缺陷,如可维护性差,不能根据URL灵活多变的显示内容等。
动态网页可以动态解析URL中的参数变化,关联数据库并动态的呈现不同的页面内容,非常灵活多变,现在大多网站都是动态网站,它们不再是一个简单的HTML,而是可能由JSP,PHP,Python等语言编写的,功能相比静态网页丰富强大的多。
2.无状态HTTP
HTTP的无状态是指HTTP协议对事务是没有记忆能力的,也就是服务器不知道客户端是什么状态。当我们向服务器发送一个Request后,服务器解析此Request,然后返回对应的Response,服务器负责完成这个过程,而这个过程是完全独立的,服务器不会记录前后状态的变化,也就是缺少状态记录这意味着如果后续需要处理需要前面的信息,则它必须要重传,这也导致了需要额外传递一些前面的重复Request才能获取后续Response,而这种效果显然不是我们想要的。为了保持前后状态,我们肯定不能将前面的请求全部重传一次,这太浪费资源了,对于需要用户登录的界面,更是棘手。
用于保持HTTP连接状态的技术就是Session和Cookies,Session在服务端,也就是网站服务器,用来保存用户的会话信息,Cookies在客户端,也可以理解为浏览器端,有了Cookies浏览器在下次访问网页时会自动附带上它发送给服务器,服务器通过识别Cookies并鉴定出是哪个用户,然后再判断用户是否是登录状态,然后返回对应的Response。
可以这么理解,Cookies里保存了登录的凭证,有了它我们只需要在下次请求携带Cookies发送Request而不必重新输入用户名、密码等信息重新登录。
在爬虫中处理需要登录才能访问的页面时,一般会直接将登录成功后获取的Cookies放在Request Headers里面直接请求,而不必重新模拟登录。
3.Session
即会话,在Web中Session对象用来存储特定用户会话所需的属性及配置信息。这样,用户在应用程序的Web页面之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。用户请求来自应用程序的Web页时,如果该用户还没有会话,则服务器会自动创建一个Session对象。当会话过期或被放弃后,服务器将终止会话。
3.Cookies
指某些网站为了辨别用户身份、进行Session跟踪而储存在用户本地终端上的数据。
会话维持
客户端第一次请求服务器时,服务器会返回一个Headers中带有Set-Cookie字段的Response给客户端,用来标记是哪个用户,客户端会把Cookies保存起来。下一次请求该网站时,客户端会把Cookies放到Request Headers一起提交给服务器,Cookies携带了Session ID信息,服务器检查该Cookies即可找到对应的Session是什么,在判断Session来辨认用户状态。
在登录某个网站时,登录成功后服务器会告诉客户端设置哪些Cookies信息,在后续访问页面时客户端会把Cookies发送给服务器,服务器再找到对应的Session加以判断,如果Session中某些设置登录状态的变量是有效的,那就证明用户是处于登录状态的,即可返回登录之后才可以查看网页内容,浏览器进行解析就可以看到了。反之,如果传给服务器的Cookies是无效的,或者Session已经过期了,我们将不能继续访问页面,可能会收到错误的Response或者跳转到登录页面重新登录。
Cookies和Session一个处于客户端,一个处于服务端,二者共同协作,就实现了登录会话控制。
属性结构
Cookies中都有哪些哪些内容,以知乎为例
我们可以看到 Cookies 有一个个条目,每个条目我们可以称之为 Cookie,取单数形式。它有这么几个属性:
Name,即该Cookie的名称。Cookie一旦创建,名称便不可更改。
Value,即该Cookie的值。如果为Unicode字符,需要为字符编码。如果为二进制数据,则需要使用BASE64编码。
Domain,即可以访问该Cookie的域名。例如设置为 .zhihu.com,则所有以 zhihu.com 结尾的域名都可以访问该Cookie。
Path,即该Cookie的使用路径。如果设置为/path/,则只有路径为/path/的页面可以访问该Cookie,如果设置为/,则本域名下的所有页面都可以访问该Cookie。
Max Age,即该Cookie失效的时间,单位秒,也常与Expires一起使用,通过它可以计算其有效时间。Max Age如果为正数,则该Cookie在Max Age秒后失效。如果为负数,则关闭浏览器时Cookie即失效,浏览器也不会以任何形式保存该Cookie。
Size,即此Cookie的大小
HTTP,即Cookie的httponly的属性。若此属性为true,则只有在HTTP Headers中会带有此Cookie的信息,而不能通过document.cookie来访问此Cookie
Secure,即该Cookie是否仅被使用安全协议传输。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。
以上便是Cookies的基本结构。
会话Cookie、持久Cookie
表面意思,会话Cookie就是把Cookie放在浏览器内存里,浏览器在关闭之后该Cookie即失效,持久Cookie则会保存到客户端的硬盘中,下次还可继续使用,用于长久保持用户登录状态。
严格意义上没有会话Cookie和持久Cookie之分,只是由Cookie的Max Age或Expires字段决定了过期的时间,通过浏览器可以计算出其有效时间。
Max Age为正数,Cookie在Max Age秒后失效,如果Max Age特别大,那就会保存横长时间。如果为负数,则关闭浏览器时 Cookie 即失效,浏览器也不会以任何形式保存该 Cookie。
所以一些持久化登录的网站其实就是把 Cookie 的有效时间和 Session 有效期设置得比较长,下次我们再访问页面时仍然携带之前的 Cookies 就可以直接保持登录状态。