今天在看一篇python爬虫的基础文章的时候,讲到了一个内容就是cookie。
这个词已经认识很久了,潜意识里把它认为是网站的缓存信息,为了更能明确意义,就去搜索了一下,顺便延展了一些session知识。

cookie /ˈkʊki/ n. 饼干;小甜点
Session /ˈseʃn/ n. 会议;(法庭的)开庭;(议会等的)开会;学期;讲习会

花了3天时间还是没读完一篇帖子的回复,现在就自己所看的进行了一点整理,还未验证,如果有错误的理解之处,希望批评指正。

cookie (储存在用户本地终端上的数据):类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。(百度百科是这么解释的,然后就是很多很专业的术语,看到脑壳都疼,差点睡着。)这里的‘用户本地终端’和‘用户客户端计算机’指的都是我们的电脑。

当我们使用自己的电脑通过浏览器进行访问网页的时候,服务器就会生成一个证书并返回给我的浏览器并写入我们的本地电脑。这个证书就是cookie。cookie包含两种类型,一种是保存在内存中的cookie。这种一般是服务端没有设置生存周期,也就是maxage为负数或者0 。这种cookie只在当前会话中有效,关掉浏览器窗口后cookie就立即失效。还有一种是保存在本地客户端的cookie,这种一般是服务器设置了cookie的生存周期maxage为正数,不管你关掉窗口还是重新打开浏览器,还是重启机器,只要cookie不失效,那么访问此网站时,浏览器就会找对应的webapplication的cookies(自己写入的)。

Cookie是可以通过HTTP响应头set cookie(这个应该是类似于数据链的报头进行设置cookie的)来设置,当然也可以通过JS脚本(这个是啥意思??)来直接设置,Cookie是按照网站来进行组织和保存的,每一个网站都可以在浏览器中保存一些Cookie,保存好了之后,浏览器向这个网站发出的请求都会携带这些Cookie,然后服务器后台就可以分析这些Cookie。

cookie可以实现的功能:1、记录使用者的喜好或者保持账号密码。2、可以跟踪会话。
有一个说法进行了解释,cookie分为2种,一种叫persistent cookies,是存在于我们电脑上的一段文本,我认为是实现第一个功能的的类型。一种叫session cookie,是针对于某一次会话,会话结束后随之消失的,(通常不能跨窗口使用),我认为是第二种。

①当我们登录网站勾选保存用户名和密码的时候,一般保存的都是cookie,将用户名和密码的cookie保存到硬盘中,这样再次登录的时候浏览器直接将cookie发送到服务端验证,直接username和password保存到客户端,当然这样不安全,浏览器也可以加密解密这样做,每个浏览器都可以有自己的加密解密方式,这样方便了用户,再比如用户喜欢的网页背景色,比如QQ空间的背景,这些信息也是可以通过cookie保存到客户端的,这样登录之后直接浏览器直接就可以拿到相应的偏好设置。

这里应该就是原始意义上的cookie,给你一些小饼干,小甜头。

②跟踪会话,比如某些网站中网页有不同的访问权限,有只能登录的用户访问的网页或者用户级别不同不能访问的,但是http请求是无状态的,每次访问服务端是不知道是否是登录用户,很自然的想到在http请求报文中加入登录标识就可以了,这个登录标识就可以是cookie,这样的cookie服务端要保存有所有登录用户的cookie,这样请求报文来了之后拿到登录标识cookie,在服务端进行比较就可以了。再比如购物网站,多次点击添加商品到购物车客户端很容易知道哪些物品在购物车中,但是服务端怎么知道每次添加的物品放到哪个登录用户的购物车中呢?也需要请求报文中带着cookie才行(在不登陆的情况下京东也是可以不断添加商品的,推测应该是登录的时候一并创建cookie并且发送物品信息),这些cookie都是为了跟踪会话用的,所以客户端有,服务端也有,并且服务端有全部的会话cookie。

这第二种cookie相对于第一种就复杂的多,牵扯到服务器及session应用。

session的理解有很多,我看的这篇帖子,不同的人有不同的认识。
1、识别用户的机制,唯一的标识,又叫session ID。
2、在服务器端存储的数据结构,后端保存的用户状态。
3、表示服务器与浏览器的一次会话过程。
【这里的有个概念,一般来说,每次请求都会新创建一个session。
如:①对于多标签的浏览器(比如360浏览器)来说,在一个浏览器窗口中,多个标签同时访问一个页面,session是一个。②对于一个同一个浏览器窗口,直接录入url访问同一应用的不同资源,session是一样的。③对于多个浏览器窗口之间,同时或者相隔很短时间访问一个页面,session是多个的,和浏览器的进程有关。】所以我的理解是,不同浏览器之间的session ID是不通用的。
4、servlet中,session指的是httpsession类的对象。

Session是什么时候被创建的?简单的理解,就是当客户端第一次向服务器提出HTTP请求的时候,服务器端给出响应,并赋予session ID,当客户端再次访问时,服务器端读取cookie中的session ID信息,就知道来访问的用户是谁了。

复杂点的说法是:

当某server端程序调用 HttpServletRequest.getSession(true)这样的语句时session ID才被创建,注意如果JSP没有显示的使用 <% @page session=“false”%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。当JSP页面没有显式禁止session的时候,在打开浏览器第一次请求该jsp的时候,服务器会自动为其创建一个session,并赋予其一个sessionID,发送给客户端的浏览器。以后客户端接着请求本应用中其他资源的时候,会自动在请求头上添加:Cookie:JSESSIONID=客户端第一次拿到的session ID这样,服务器端在接到请求时候,就会收到session ID,并根据ID在内存中找到之前创建的session对象,提供给请求使用。这也是session使用的基本原理。两次请求同一个jsp时,当第二次请求的时候,已经添加session ID的信息。

该作者还特别说明了session的删除时间,我觉得非常帮助理解:

①Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。
②程序调用HttpSession.invalidate()
③服务器关闭或服务停止
说明:session不会因为浏览器的关闭而删除

session是服务器端的内存中。不过可以通过特殊的方式做持久化管理,比如:数据库、文件、集群等,大型的网站一般有专门的session服务器集群。

注意:访问*.html的静态资源因为不会被编译为Servlet,也就不涉及session的问题。

Servlet /'sɜvlet/ n. (尤指 Java 语言中在服务器上运行的)小型应用程序;小服务程序

sessionID 一般是附在HTTP请求报文头(header)最后一行cookie属性的值里进行传递的。但当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Session ID,ID会附带在每个URL的后面,我们就可以在地址栏看到 sessionid=KWJHUG6JJM65HS2K6之类的字符串。(我认为这是JS脚本的实现方式。)

header /ˈhedər/ n. 头球;页眉;数据头;收割台

这里有个概念就是http协议是无状态的协议,每次访问服务端是不知道是否是登录用户的。(百科解释是:无状态协议是指比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登录该网站,但是服务器并不知道客户关闭了一次浏览器。)

简单来理解:就是cookie和session是保存会话数据的两种技术。cookie保存到客户端,session保存到服务器端。

感谢自己,感谢你。