Cookie和Session前言Cookie和Session来自CookieCookie属性Cookie创建Cookie分类SessionSession工作原理创建Session保存Session销毁Session检查Session是否无效总结CookieSession异同点:工作流程:前言最近总有一些刚接触爬虫的小伙伴总是不明白Session和Cookie是干什么的。为什么爬虫在访问网页时要使用Session?为什么headers可以携带cookies以login的形式进入?网页,这两个东西的原理是什么?cookies和session的由来在Web发展史上,我们知道浏览器和服务器之间使用的是简单的http协议,而这个协议是“无状态”的,所以这使得服务器无法知道谁在浏览网页,但是显然,有些网页需要知道用户的状态,比如登录、购物车等。于是为了解决这个问题,相继出现了四种技术,即隐藏表单字段、URL重写、cookies和session。当然现阶段用的最多的技术自然是cookies和session了。CookieCookie是浏览器保存在用户计算机上的文本。简单的说,当用户通过http请求访问服务器时,服务器会返回一些字典的键值对给客户端浏览器,并在数据中添加数据。当条件满足,用户下次访问服务器时,数据会通过请求头完整的带回服务器,服务器根据这些信息判断不同的用户。简单的说,cookie就是服务器端传送给客户端并保存到客户端的一段文本信息。Cookie的大小和数量有限。Cookie属性我们在访问网页的时候,看到网站的请求头如果携带了cookie,就会包含Set-Cookie属性。下面分析一下Set-Cookie中包括哪些属性项:属性项属性项介绍Name=VALUEkeyvalue是的,可以设置保存的键值对属性。这里的NAME不能与其他属性的名称相同。expires过期时间,过了这个时间,cookie就失效了。加密设置,设置后,Cookie属性只能在SSH连接环境下返回。下面详细介绍Domain是做什么的。现在假设有两个域名:域名A:a.qq.com.cn域名B:b.qq.com.cn显然域名A和域名B都是qq.com.cn的子域名。如果我们将域名A中cookie的域设置为qq.com.cn,那么qq.com.cn及其子域都可以获得这个cookie,即域名A和域名B都可以获得这个cookie。如果域名A和域名B都将cookie的doamin设置为qq.com.cn,则会发生覆盖。如果域名A没有显式设置cookie的域方法,那么域就是a.qq.com.cn。不同的是,此时域名A的子域名将无法获取cookie。Cookie创建Set-Cookie:value[;过期=日期][;域=域][;路径=路径][;secure]Set-Cookie:delPer=0;expires=Thu,16-Aug-205012:15:40GMTSet-Cookie:BDSVRTM=0;path=/Set-Cookie:BD_HOME=0;path=/Set-Cookie:H_PS_PSSID=1462_21106_26925_22074;path=/;domain=.baidu.com在构造http返回字节流时,会将Header中的所有项按顺序写出,不作任何修改。因此,当浏览器收到http返回的数据时,会分别解析每一个Header项。Cookie分类会话级cookie:所谓会话级cookie是指cookie在浏览器关闭后即失效。持久级cookie:保存在硬盘上的cookie,只要设置了过期时间,就是硬盘级cookie。既然cookie保存在客户端,当我们请求一个URL时,浏览器就会根据URL路径在请求头中将符合条件的cookie发送给服务器。SessionCookie有大小和数量限制,越来越多的cookie代表着客户端和服务端传输量的增加。是不是每次都可以不传递所有的cookie值,只传递一个唯一的ID,通过这个ID直接在服务器上查找用户信息呢?答案是肯定的,这就是我们的Session。会话基于cookie工作。同一个客户端每次访问服务器,只要浏览器第一次访问服务器,服务器都会设置一个id,保存一些信息(比如登录时保存用户信息,视具体情况而定),并通过cookie将此id保存到客户端。客户端每次与服务器交互时只传递这个id,以维护浏览器和服务器的状态。这个ID通常是一个名为JSESSIONID的cookie。现阶段,有四种方法可以使Session起作用:通过URL传递SessionID通过Cookie传递SessionID通过SSL传递SessionID通过隐藏形式传递SessionID)方法创建Session,如果当前SessionID没有对应的HttpSession对象,则创建新建一个,并添加到org.apache.catalina.Manager的Sessions容器中保存,以保持状态。当然,这个SessionID是唯一保存的Session。从图中可以看出,Manager类中已经保存了Session对象,并使用StandardManager作为实现类。StandardSession对象通过requestedSessionId从StandardManager的Sessions集合中获取。让我们看看StandardManager是如何管理所有StandardSession对象的生命周期的。当Servlet容器关闭时:StandardManager会持久化未过期的StandardSession对象(必须调用Servlet容器中的stop和start命令,不能直接kill掉)当Servlet容器重启时:StandardManager初始化会重新读取这个文件并解析出所有会话对象。销毁一个SessionSession的生命周期是从创建到超时到期。也就是说,当session创建时,浏览器关闭,session级cookie被销毁。如果没有超过设定的时间,则不会销毁sessionID对应的session。检查Session是否无效检查每个Session是否无效是在Tomcat的一个后台线程中完成的(在backgroundProcess()方法中);后台进程除了检查Session是否无效外,调用request.getSession()还会检查Session是否过期,当然如果过期调用该方法会重新创建一个新的Session。总结一下CookieSession的相同点:Session和Cookie都是为了让http协议有状态而存在的。Session是通过Cookie来工作的,通过Cookie传递的SessionID让Session知道客户端是谁。区别:Session向服务器保存信息,Cookie向客户端保存信息。工作流程:当浏览器第一次访问服务器时,服务器创建一个Session并通过Cookie将SessionID带给浏览器保存在客户端,服务器根据Session中保存相应的客户端信息商业逻辑;上传Cookie时,服务端获取到Cookie后获取里面的SessionID,以保持状态。
