skyADMIN

angular同时多个异步请求下的登陆异常

最近的项目遇上了这样一个问题。比如用户完成注册以后,会有一封邮件发送到注册邮箱里,等待用户点开,继续接下来的注册步骤。

因为是用angular写,用户点开连接后,会用$location找到url里的token参数,post到后端给我提供的一个API里,然后后端会校验该token值,然后为当前用户在session里记录一下。用户侧就可以开始输入信息填写了。

可是我发现现实和想象不是很一致,具体表现在,发送了token以后,用户侧还是显示未登录状态(及服务器端没有相应的已登录信息在session里)。一开始我以为是后端的锅。

在这里不得不提到一个神器叫postman,在应付前后端分离的RESTful风格的webapp的开发方面真是神器,可以完美确认到底是前端的锅还是后端的锅。具体举例就是它可以发送任意格式的请求,get、post、delete……等等,还可以保存请求记录。(以前就是后端总是没法测试post请求)

用postman一测试,先发token,再访问一个isLogin接口,一切正常。那问题应该是前端的,想了半天做出如下猜测:

用户点开url的时候,没有cookie,然后多个异步请求发出,唔,举个例子,比如4个吧。确认token的请求,请求API1的,请求API2的,请求API3的。异步请求,就是发了就不管了继续干别的,有返回了再来看看。那么返回的顺序就不是我们能控制的了。有可能API2的先回,确认token的接着回来,API3的,API1的。

一开始啥cookie都没有,那么服务器端收到4个请求,应该是看作4个用户的同时访问。会分别为4个response设定不同的cookie信息。然后回到家的时候就是按顺序挨个儿把自己身上带的cookie弄到浏览器上。

那么,最后一个,如果没有凑巧就是确认token的那个请求,身份认证自然是不成功的。

解决方法的话,我目前的处理方法是改成promise来保证token先被确认完,cookie正常后,再发其他请求。不过今晚写这文章的时候又想到一种新的方法。取不重要的信息的时候,不要让他们带cookie头回来,不过这个部分怎么做,我就不太清楚了。

码字很辛苦,转载请注明来自环宇博客《angular同时多个异步请求下的登陆异常》

评论