在Web应用中,HTTP请求是无状态的。即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开页面都需要登录,出现cookie和Session。CookieCookie是客户端保存用户信息的一种机制。用来记录用户的一些信息,也是Session的一种实现方式。cookies中存储的数据量是有限的,它们都存储在客户端浏览器中。不同的浏览器有不同的存储大小,但一般不会超过4KB。因此,cookies的使用实际上只能存储一小段文本信息。例如:登录网站,今天输入用户名和密码登录,很多情况下第二天打开。此时使用的一种机制是Cookie。SessionSession是另一种记录客户状态的机制。是保存在服务器端的数据结构(主要存储SessionID和Session内容,还包含很多自定义内容如:用户基本信息、权限信息、用户机构信息、固定变量等),这个数据可以保存在集群、数据库、文件中,用于跟踪用户状态。当客户端浏览器访问服务器时,服务器将客户端信息以某种形式记录在服务器上。这是会议。当客户端浏览器再次访问时,只需要从Session中查找客户端的状态即可。用户首次登录后,浏览器会将用户信息发送给服务器,服务器会为用户创建一个SessionId,并在响应内容(Cookie)中将SessionId返回给浏览器,浏览器会将数据保存在本地。当用户再次发送请求时,浏览器会自动将上次请求中保存的cookie数据携带到服务器。服务端收到请求信息后,会通过浏览器请求的数据中的SessionId判断哪个用户是当前用户,然后根据SessionId在Session库中获取用户的Session数据返回给浏览器。比如:购物车,添加了商品后,客户端可以知道添加了哪些商品,服务器端如何区分,所以还需要存储一些信息,使用Session。如果说Cookie机制是通过查看客户身上的“护照”来确定客户的身份,那么Session机制则是通过查看服务器上的“客户名单”来确认客户的身份。Session相当于程序在服务器上创建的一个客户文件。当客户来访时,只需要查询客户档案表即可。session生成后,只要用户继续访问,服务器就会更新session的最后访问时间,维持session。为了防止内存溢出,服务器会从内存中删除长时间不活动的会话。这个时间是会话超时。如果超过超时时间还没有访问服务器,Session将自动失效。TokenHTTP请求以无状态形式连接。也就是说,HTTP服务器不知道这个请求是否与之前的请求有关。于是就有了Session的引入,即服务端和客户端都保存一段文本,客户端每次发起请求时都携带一段文本,让服务端知道客户端是否发起了请求。这样,客户端频繁的向服务器端发送请求数据,服务器端频繁的去数据库查询用户名和密码,并通过比对判断用户名和密码是否正确。但是Session的存储需要空间,频繁的查询数据库给服务器带来了很大的压力。在这种情况下,Token应用就诞生了。Token是服务器生成的一串串字符串,作为客户端发出请求的令牌。当客户端第一次访问服务端时,服务端会根据传入的唯一标识userId,通过一些算法加一个key生成一个Token,然后将Token用BASE64编码后返回给客户端。终端保存Token(可以以数据库或文件的形式保存在本地)。在接下来的请求中,客户端只需要带上Token,服务端收到请求后会使用相同的算法和密钥对Token进行验证。最简单的Token组成:uid(用户的唯一标识),time(当前时间的时间戳),sign(签名,Token的前几位+salt通过hash算法压缩成一定长度的十六进制字符字符串,可以防止恶意第三方向服务器拼接Token请求)。使用基于Token的认证方式,无需在服务器端存储用户登录记录。大致流程如下:客户端使用用户名和密码请求登录服务器,收到请求验证用户名和密码。验证成功后,服务端会颁发一个Token,然后将Token发送给客户端。收到Token后,可以将其存储在cookie或数据库中。客户端每次向服务端请求资源时,都需要带上服务端颁发的Token。Token,如果验证成功,将请求的数据返回给客户端。APP登录时,将加密后的用户名和密码发送给服务器。服务器验证用户名和密码。如果成功,则通过某种方式随机生成一个32位的字符串作为Token,存储在服务器中,并将Token返回给APP。以后APP请求的时候,需要校验的地方都要带上Token,然后服务器校验Token,成功返回需要的结果,失败则返回错误信息。他重新登录。同一个APP、同一个手机目前只有一个Token;手机APP会存储一个当前有效的Token。服务器上的Token设置一个有效期,每次APP请求时都会校验Token和有效期。
