如保持登录状态

一:为什么需要保持登录状态

因为http协议是无状态的,第一次请求和第二次请求之间毫无联系,http协议不会记录两次请求之间的关联。而我们不能让用户登录之后马上又要登录,所以需要记录用户的登录状态。

二:怎样记录用户的登录状态

使用session+cookie的方式记录登录状态

这里解释一下什么是session

Session一般译作会话,牛津词典对其的解释是进行某活动连续的一段时间。从不同的层面看待session,它有着类似但不全然相同的含义。比如,在web应用的用户看来,他打开浏览器访问一个电子商务网站,登录、并完成购物直到关闭浏览器,这是一个会话。而在web应用的开发者开来,用户登录时我需要创建一个数据结构以存储用户的登录信息,这个结构也叫做session。因此在谈论session的时候要注意上下文环境。

三:具体方法

未登录或者登录失效情况下要进行的拦截部分

1.页面拦截

① 如果是单页面,怎在请求页面的时候,浏览器所请求的index.html会正常返回。同时需要有一个接口来查询登录态,根据这个接口返回的不同信息来区分展示页面不同的路由。

若已登录,则允许访问某页面;若未登录,跳转到登录路由。

②如果是多页面,则是在服务端查询登录态,若已登录,则返回相应的页面index.html;若未登录,则跳转到登录页面login.html。

2. 接口拦截

用户在访问某些有权限控制的接口时,需要做登录状态检测,这个是在服务端控制的,通过返回不同的状态码来区分(403或者200)

登录时前端和后端需要做的具体操作:登录状态存储

1. 登录信息存储在服务端

服务端通过cookie所存储的sessionid作为key,来获得服务端map里存储的此key所对应的value,这个value则是用户的详细信息。因此,服务端需要存储这个对象或者说是map,即我们所说的session。

存储session的方式有2种,包括存储在内存和存储在数据库里面。存储在内存是不合适的,因为服务重启就会导致信息丢失。所以应该存储在数据库里。

对于存储在数据库这种情况,需要一直同步用户登录状态,所以需要频繁修改数据库。当用户登陆的时候,需要在数据库添加一条记录。当用户退出时,删掉此用户的记录。并且因用户操作网站而导致cookie生效时间需要延长,这个时候也需要修改数据库(修改数据库里面session有效时间)。

存储在数据库里,重点是要注意同步前端cookie和后端session的过期时间。关键点包括:

①什么时候清掉失效的session。因为cookie过期时,浏览器不会再将cookie带到服务端,但是此时服务端session还在数据库里。当用户登录的时候,服务端不知道这个用户是由于cookie过期而没有cookie还是因为是新用户而没有cookie。所以要找到一个时机去删掉服务端的session来同步登录信息?

一种解决方法:把过期信息存在session里,让cookie一直不过期,所以只要登陆过,就有cookie,但是取出来的session可能是已经过期的,这时候将其删除,并把用户标记为未登录。

② 当用户请求接口或者页面的时候(即用户对网站有操作),需要不断刷新cookie的过期时间。这就意味着也要一直操作数据库更新session,成本太高。所以我们可以只让部分接口来刷新cookie过期时间,其他接口不刷新过期时间。

2. 登录信息存储在客户端

登录信息经过加密之后存储在cookie里面

1:客户端输入用户名和密码,提交到服务端验证

2:服务端验证成功后,给客户端返回以下值:

​ uid : 用户的唯一标示

​ time : 当前unix时间戳

​ key : MD5(uid+time+”一个只有你自己知道的字符串密钥”)

3:客户端保存以上3个值在本地,每次HTTP请求时,将以上3个值发送到服务端

4:服务端验证key,判断如果与客户端发送的key一致,则说明用户身份无误

5:服务端每次收到请求时,通过当前时间-客户端time字段得到的差值,可以控制这个key的有效期