HTTP之COOKIE及SESSION

cookie

Cookie通常也叫做网站cookie,浏览器cookie或者httpcookie,是保存在用户浏览器端的,并在发出http请求时会默认携带的一段文本片段。它可以用来做用户认证,服务器校验等通过文本数据可以处理的问题。那也就是说cookie将会带有用户身份的信息

HTTP请求+cookie的交互流程

1

比如第一次登录某网站,我们会发出http请求+用户认证信息。

服务器将会对该请求进行认证,认证成功后,对于与该用户认证信息,将生成cookie,并且对浏览器发送http响应,并且在响应头中有Set-Cookie,Set-Cookie响应头是服务器返回的响应头用来在浏览器种cookie,一旦被种下,当浏览器访问符合条件的url地址时,会自动带上这个cookie

于是我们的浏览器将会提取并存储cookie信息于内存或磁盘中。

1
2
3
4
5
可以大致把Cookie分为2类: 回话cookie和持久cookie

会话cookie: 是一种临时的cookie,它记录了用户访问站点时的设置和偏好,关闭浏览器,会话cookie就被删除了

持久cookie: 存储在硬盘上,(不管浏览器退出,或者电脑重启,持久cookie都存在), 持久cookie有过期时间

第二次登录该网站时,浏览器先在电脑里寻找对应该网站的Cookie.txt文件。如果找到,则根据此Cookie.txt产生Cookie报头,放在HTTP请求报文中发给服务器。

服务器接收到包含Cookie报头的请求,检索其Cookie中与用户有关的信息,生成一个客户端所请示的页面应答传递给客户端。 浏览器的每一次网页请求,都可以传递已存在的Cookie文件,例如,浏览器的打开或刷新网页操作。

cookie的内容

主要包括:名字,值,过期时间,路径和域。

1)Name 和 Value 属性由程序设定,默认值都是空引用。

2)Domain属性的默认值为当前URL的域名部分,不管发出这个cookie的页面在哪个目录下的。

3)Path属性的默认值是根目录,即 ”/” ,不管发出这个cookie的页面在哪个目录下的。可以由程序设置为一定的路径来进一步限制此cookie的作用范围。

4)Expires 属性,这个属性设置此Cookie的过期日期和时间。

Path和Domian属性

–path:  

1
2
3
如果http://www.china.com/test/index.html 建立了一个cookie,那么在http://www.china.com/test/目录里的所有页面,以及该目录下面任何子目录里
的页面都可以访问这个cookie。这就是说,在http://www.china.com/test/test2/test3 里的任何页面都可以访问http://www.china.com/test/index.html
建立的cookie。

1
2
3
4
但是,如果http://www.china.com/test/ 需要访问http://www.china.com/test/index.html设置的cookes,该怎么办?

我们要把cookies的path属性设置成
“/”。在指定路径的时候,凡是来自同一服务器,URL里有相同路径的所有WEB页面都可以共享cookies。

–Domain:

1
比如: http://www.baidu.com/xxx/login.aspx 页面中发出一个cookie,Domain属性缺省就是www.baidu.com ,可以由程序设置此属性为需要的值。值是域名,比如www.china.com。这是对path路径属性的一个延伸。如果我们想让 www.china.com能够访问bbs.china.com设置的cookies,该怎么办? 我们可以把domain属性设置成“china.com”, 并把path属性设置成“/”

  

session

HTTP协议作为无状态协议,对于HTTP协议而言,无状体同样指每次request请求之前是独立的,当前请求并不会记录它上一次的请求信息。也就是说如果没有session的话,你登录淘宝,然后看完这一页,跳下一页的时候,又要重新进行身份认证,需要进行无数次http请求。于是,Web Server中引入了session的概念,用来保存客户端的状态信息。
2

session的工作原理

1)当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号;

2 ) 这个用户随后的所有请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪个session。

这种机制不使用IP作为标识,是因为很多机器是通过代理服务器方式上网,没法区分每一台机器。

对于session标识号(sessionID),有两种方式实现:cookies和URL重写。

然后用一个很形象的比喻来理解session

假设Web Server是一个商场的存包处,
顾客(HTTP-request),第一次来到存包处,管理员把顾客的物品存放在某一个柜子里面(这个柜子就相当于Session),然后把一个号码牌交给这个顾 客,作为取包凭证(这个号码牌就是Session ID)。顾客(HTTP Request)下一次来的时候,就要把号码牌(Session ID)交给存包处(Web Server)的管理员。管理员根据号码牌(Session ID)找到相应的柜子(Session),根据顾客(HTTP Request)的请求,Web Server可以取出、更换、添加柜子(Session)中的物品,Web Server也可以让顾客(HTTP Request)的号码牌和号码牌对应的柜子(Session)失效。顾客(HTTP Request)的忘性很大,管理员在顾客回去的时候(HTTP Response)都要重新提醒顾客记住自己的号码牌(Session ID)。这样,顾客(HTTP Request)下次来的时候,就又带着号码牌回来了。

实现session的两种方式

1)URL重写。

Web Server在返回Response的时候,检查页面中所有的URL,包括所有的连接,和HTML Form的Action属性,在这些URL后面加上“;jsessionid=XXX”。
下一次,用户访问这个页面中的URL。jsessionid就会传回到Web Server。

2)Cookie。

如果客户端支持Cookie,Web Server在返回Response的时候,在Response的Header部分,加入一个“set-cookie: jsessionid=XXXX”header属性,把jsessionid放在Cookie里传到客户端。

客户端会把Cookie存放在本地文件里,下一次访问Web Server的时候,再把Cookie的信息放到HTTP Request的“Cookie”header属性里面,这样jsessionid就随着HTTP Request返回给Web Server。

总结:Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份

参考:
https://www.cnblogs.com/bq-med/p/8603664.html
https://www.cnblogs.com/lyy-5518/p/5460994.html

0%