http 无状态性

定义:

协议对于事务处理没有记忆性,例如客户端发http请求给服务端后再发一次,服务器不知道第二个请求是刚才那个用户发的。

因为HTTP的无状态,因而会产生对应的问题

设想一个场景,用户小明在网站上购物,登录确认一下小明的身份跳转进购物网页,但是下一秒服务器就不认识小明了,购物或者添加购物车的过程中 一次次验证发送请求的是谁?

这样很不人性化。用Cookie和Session技术解决这样的问题。

Cookie技术:

Cookie实际上是一小段的文本信息,放在http协议header的字段中。客户请求服务器时,服务器回应的过程中带着一个Cookie信息,下一次客户再请求信息把这个Cookie信息带上,服务器就知道是刚才那货又发来请求了。服务器还可以根据需要修改Cookie的内容。

注意:

Cookie技术不可跨域名,例如浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。

保存登录信息的方式有很多种:

  1. 最直接的是把用户名与密码都保持到Cookie中,下次访问时检查Cookie中的用户名与密码,与数据库比较。这是一种比较危险的选择,一般不把密码等重要信息保存到Cookie中。
  2. 是把密码加密后保存到Cookie中,下次访问时解密并与数据库比较。这种方案略微安全一些。如果不希望保存密码,还可以把登录的时间戳保存到Cookie与数据库中,到时只验证用户名与登录时间戳就可以了。
  3. 只在登录时查询一次数据库,以后访问验证登录信息时不再查询数据库。实现方式是把账号按照一定的规则加密后,连同账号一块保存到Cookie中。下次访问时只需要判断账号的加密规则是否正确即可。

Session技术:

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上;

客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了;

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份;

Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了;

Session和Cookie的关系:

  • cookie是一个实际存在的、具体的东西,http 协议中定义在 header 中的字段。
  • session是一个抽象概念、开发者为了实现中断和继续等操作,将client和server之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。
  • 即session描述的是一种通讯会话机制,而cookie只是目前实现这种机制的主流方案里面的一个参与者,它一般是用于保存session ID。
原文地址:https://www.cnblogs.com/fangdada/p/14916914.html