今天晚上 APP 发版,其余功能都 OK,但是把 HTTP 更新到 HTTPS 之后,发现打开某个页面有 50%以上概率会收到服务器返回 token 失效的提示。然后一群人开始苦逼地排查问题。
首先查看该页面的网络请求。因为页面比较复杂,进入该页面的时候会同时发起 3 个请求,然后收到 token 失效提示的请求并不固定,所以怀疑是并发的问题。
照这个思路,试了下测试环境,并不能复现该问题(测试环境只有一台机器)。然后将生产环境关到只剩一台机器(本来有三台),也没再出现该问题。
将生产环境三台机器都打开,换回 HTTP,没有出现问题。
至此认为是,在有多台机器的情况下,使用 HTTPS,同时发起多个请求,会出现该问题。
查看服务器代码(其实之前也看了,没找到原因),收到 APP 请求后,会取 cookie 中的 sessionid,然后以 sessionid 为 key 去 redis 里面取保存的 token,再用来和 APP 上传的 token 比较。两者不相等的话,就认为是 APP 的 token 已经过期了。
感觉没有从 redis 里读取到 token,但是就几行代码,看来看去都觉得没啥问题。最后由于时间的关系,放弃这次上 HTTPS 的计划了。不过以后总是要上的,希望大佬给分析下,有可能是什么原因。
生产环境是三台 tomcat 服务器,共享一个 redis,通过某些策略做了负载均衡。HTTPS 使用的自签名证书,tomcat 将 80 端口的请求都重定向到了 443 端口。
我觉得大佬们可以完全当我们这边负责部署的人是小白,可能犯了某种搜索引擎都找不到的低级错误。毕竟 tomcat 配置 HTTPS 都配置了半天,而且鉴于上面的测试,我极度怀疑是这个配置出错导致的。
PS:可能上面我描述得不太准确(Android 程序员的视角),各位大佬将就着看吧,帮忙分析下原因,当然最好是有解决方案啦→_→等我睡醒再来感谢各位。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.