前两天老板提了下需求:把用户登录的账号密码用cookie保存下来并且有效期为7天。

由于对cookie不是很熟悉,查了很多资料,觉得挺简单的,于是开始写,

代码如下:

cookie代码:
image.png

1.app的启动页倒计时完成后调用checkCookie():
检查是否有存cookie,有存cookie就模拟登入,成功后跳到首页,
没有存cookie就跳到登入页
image.png

2,在login页点击登入成功后调用cookie存储:
image.png

上面逻辑,代码貌似没有任何问题,结果是第一次打开app是正常的,关闭后再次打开会发现获取不到cookie会跳到登入页,并且登入页面报如下错误:
image.png

后面无论怎么操作打开的页面都是这样。

找了很久的原因,最终发现问题:
1.setCookie中的问题:
image.png
如下代码才是正确的(转译加指明了根路径这样所有页面都可以获取cookie了):image.png

2.后面考虑到其它页面是以token为必传的条件去请求数据的,tookie应该保存的是token。而checkCookie成功后应该是直接跳转到首页,而不是模拟用户登入去请求登入的接口,因为这样一来,token就变了,token是同一个账号每次登入请求获取到的token都是不一样的。

最终代码如下:

cookie代码
image.png

app启动页:
image.png

login登入成功后:
image.png

总结:

1.如果cookie存的有中文的一定要编译下再存cookie,获取时再解码。
2.如果是多个页面都要获取cookie中存的值,那就应该给cookie一个根目录的路径。
3.像上面的代码存的是token,而token又是动态变化的(这里的变化是指只要是帐号重新登入token就会变化),可以在获取cookie中的token后,把获取到的token值的重新保存一次。

真机问题

到这里为止,用浏览器测试是没有任何问题的,现在真机上测试下:
结果是cookie获取不到。网上查了很多资料也没有明确的解决办法。有说是真机没有开启cookie权限,也有说可能是webview的问题。不管什么问题,后面我选择的最终解决办法是:localStorage+时间判断

解决思路:

1.当第一次登入时获取到的token存localStorage,并且也用localStorage存下当前的时间timestamp。
2.当启动app时获取timestamp判断是否是第一次登入,获取不到timestamp说明是第一次,直接进登入页;获取到了timestamp说明不是第一次登入,后面就判断如果当前时间戳> 前面存的时间戳+过期时间7天 表示已经过期,也进登入页,反之进项目首页。

代码如下:

login页登入成功后:
image.png

启动页倒计时完成后调用如下方法:
image.png