iOS问题记录本:应用启动时网络请求没有cookie

0.背景描述

因为NSURLSession会自动处理cookie,所以日常开发时不需要特别的处理请求中的cookie。
但是上周项目开发新功能时发现,有时发送请求时提示会话失效,而且是几率性的,非必现。

项目的服务端分为登录系统和业务系统,业务系统中部分用户需要使用登录会话信息中的token,token在cookie中是有保存的,当然也可以将token放在url后面传过去。
之前因为以为NSURLSession会自动处理cookie,所以就没有在url后面拼接token,直接使用的cookie中的token,一直没有出现过会话失效的问题。但是这次开发发现启动应用开始时,有些请求cookie中的token值是错的,导致会话失效。

1.问题查找

1.1.token覆盖

通过抓包发现启动开始时的几个请求反馈报文中会出现无效的token,而请求一旦使用这些无效token就会出现会话失效问题。
经过挨个请求的排查,发现存在以下问题:
- 如果网络请求的请求报文cookie中没有token,那么服务端就会生成新的token;新的token是无效的;
- 应用启动时登录系统有一个请求是更新用户信息的请求,该请求url后拼接了token,所以该请求的反馈报文中的token值是正常的;而且该请求的请求报文中也没有token;
- 以上的两种请求,后返回请求的反馈报文中的token值会覆盖先返回的;

所以,应用中出现会话失效的原因就是因为:无cookie请求的反馈报文中生成了新的token,且在测试环境中该请求响应较慢,导致覆盖了更新用户信息请求反馈报文中的正确的token。

1.2.cookie未持久化

那么现在的问题就变成了,为什么网络请求中是有cookie的,但是每次应用启动时,开始的请求就不带cookie呢?
是没有存储还是取不到?是AFNetworking关闭掉了cookie处理?
通过代码调试发现,应用运行时NSHTTPCookieStorage中是有cookie的,而再次启动时NSHTTPCookieStorage中确实没有cookie。
而且AFNetworking中也没有对于cookie进行操作,cookie处理其实都是系统NSURLSession的功能。

最后还是通过大量查找相关文章,发现了问题的原因原来和expireTime有关。

2.问题原因

应用启动时没有cookie的原因在于,系统在应用退出后,清空了保存的cookie,原因是expireTime未设置。在此文章中,作者对此作了表述:

setcookie(“TestCookie”,”my cookie value”); //没设置失效时间 关闭app后系统不会持久化Cookie
setcookie(“TestCookie”,”my cookie value”,time()+3600*24); //设置expire失效时间 关闭app后系统自动持久化Cookie

随后我查看了网络请求中带的cookie,确实没有设置expireTime,所以导致应用关闭了,cookie实际上并未持久化cookie。那么再次启动时,请求就带不上cookie了。

3.解决办法

出现该问题的原因其实是有以下几点:
1. 因为服务端设置cookie时没有设置过期时间,所以iOS在保存cookie时对于没有过期时间的数据在应用关闭后就会清除掉;
2. 第二次启动时,实际上第一个请求返回之前发送的请求都是没有带cookie的。而因为请求没有带cookie,服务端就又自己生成了新的token放cookie里;
3. 更新用户信息的请求是可以返回正确的token的,所以该请求和没有带cookie的请求哪个后返回,哪个的token就会覆盖前一个;出问题的时候就是因为正确的token被覆盖了,所以该问题不是必现的。
4. 测试环境下运行可能是因为业务系统的响应速度比登录系统的响应速度快,导致错误的token大几率的覆盖登录系统返回的正确的token。

想要解决问题,也有几种方法:
- 服务端为cookie设置过期时间,这可以从根本上解决问题;
- 服务端在接收到无cookie的请求时不要再生成新的token;
- 移动端发送需要使用token的请求时,将token拼接到url后面。

当然最好的解决方法是第一个,不过我们嘛,你们懂的,还是让移动端改……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值