首页 > 其他 > 详细

cookie和session

时间:2020-08-12 09:17:56      阅读:48      评论:0      收藏:0      [点我收藏+]

无状态HTTP协议

无状态协议

  • 协议的状态是指下一次传输可以“记住”这次传输信息的能力。
  • http协议 不会为了下一次连接而维护这次连接所传输的信息,因此 http协议 是一个无状态的面向连接的协议(Stateless Protocol)。比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登陆该网站,但是服务器并不知道客户关闭了一次浏览器。
  • http协议 无状态不代表 http协议 不能保持 TCP连接,更不能代表 http协议 使用的是 UDP协议(无连接)
  • HTTP/1.1 起,默认都开启了 Keep-Alive,保持连接特性。简单地说,当一个网页打开完成后,客户端和服务器之间用于传输 http数据TCP连接 不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
  • Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。http是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive(服务器处理完客户的请求后,并收到客户端的应答后,不会立即断开)没能改变这个结果

会话(session)跟踪

会话是指用户登录网站后的一系列动作,比如浏览商品添加到购物车并购买。会话(session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是cookiesession

  • cookie 通过在客户端记录信息确定用户身份
  • session 通过在服务器端记录信息确定用户身份,但是由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以 session 机制可能需要借助于 cookie 机制来达到保存标识的目的,但实际上还有其他选择,比如说重写URL隐藏表单域

虽然 cookiesession 起到保存客户端状态的作用,但是它们并没有改变 http 协议本身这种无状态的性质,可以理解为在应用上做了状态保留。

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是cookie 的工作原理。

cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个cookie。客户端会把cookie保存起来

当浏览器再请求该网站时,浏览器把请求的网址连同该cookie一同提交给服务器。服务器检查该cookie,以此来辨认用户状态。服务器还可以根据需要修改cookie的内容。

会话cookie

不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为 会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。

持久cookie

设置过期时间,浏览器就会把cookie保存在硬盘上关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在浏览器的不同进程间共享。这种称为 持久cookie

不可跨域名性

cookie 具有不可跨域名性。就是说,浏览器访问百度不会带上谷歌的cookie;

session

session是另一种记录客户状态的机制,不同的是cookie保存在客户端浏览器中,而session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是session。客户端浏览器再次访问时只需要从该session中查找该客户的状态就可以了。

每个用户访问服务器都会建立一个session,那服务器是怎么标识用户的唯一身份呢?
事实上,用户与服务器建立连接的同时,服务器会自动为其分配一个sessionId。客户端将sessionId存在cookie中。浏览器会在每次发请求时将浏览器的cookie自动附加到HTTP头信息中,发送到服务器。服务器通过sessionId作为key,读写到对应的value,这就达到了保持会话信息的目的。

session的创建

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了sessionId,如果已包含则说明以前已经为此客户端创建过session,服务器就按照sessionId把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含sessionId,则为此客户端创建一个session并且生成一个与此session相关联的sessionId,sessionId的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionId将被在本次响应中返回给客户端保存。

禁用cookie

如果客户端禁用了cookie,通常有两种方法实现session而不依赖cookie。

  • URL重写,就是把sessionId直接附加在URL路径的后面。
  • 表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把sessionId传递回服务器。比如:
<form name="testform" action="/xxx"> 
    <!-- 隐藏sessionId字段 value -->
    <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> 
    <input type="text"> 
</form> 

session共享

对于多网站(同一父域不同子域)单服务器,我们需要解决的就是来自不同网站之间sessionId的共享。由于域名不同(aaa.test.com和bbb.test.com),而sessionId又分别储存在各自的cookie中,因此服务器会认为对于两个子站的访问,是来自不同的会话。解决的方法是通过修改cookies的域名为父域名达到cookie共享的目的,从而实现sessionId的共。带来的弊端就是,子站间的cookie信息也同时被共享了。

参考文献

为什么说http协议是无状态的?
session和cookie的区别

cookie和session

原文:https://www.cnblogs.com/baboon/p/13488233.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!