前言
在公司的业务中, 有如下的业务场景:
在 App 端中点击活动 banner 图, 跳转到 H5 端的活动页面;
若用户已在 App 中登陆, 则在跳转到 H5 端时, 携带一个后台下发的参数 (autoLogin), 表明用于已在 App 端登陆;
H5 页面获得参数后, 通过 Ajax 请求后台, 获得用户的账户信息;
在此实现了 H5 端 自动登陆 的功能.
问题
然而, 在测试阶段, 我们发现有时候出现自动登陆失败的情况.
1.gif
排查
根据 前言 中提及到的业务流程, 我们一开始怀疑在自动登陆失败时, App 未带上表面已登陆的参数 (autoLogin).
通过 Fiddler.exe 抓包, 我们发现发生自动登陆失败时, 并非是未从 url 获取到 autoLogin 参数, 而是在 H5 端 Ajax 请求用户信息时后台报错.
问题都这么明了, 此时不怼后台, 更待何时
2.jpg
此处省去联调, 扯皮, 打脸等过程.......
我们经过艰苦卓绝的抓包, 发现当自动登陆失败时, H5 端提交的 autoLogin 有一个 空格 !!!
然后对比了后台下发给 App 的 autoLogin 参数, H5 端提交的 autoLogin 少了个 加号 !!!
结论
当 App 打开 H5 页面时, 若 autoLogin 参数携带 加号 ,
由于浏览器 自动编码 url 的机制, 将 加号 编码成 空格 的 , 而不是 +,
导致 H5 端获取了一个错误的 autoLogin 参数, 导致自动登陆失败.
解决方法
App 传参过来的时候, 先将请求参数编码. H5 端获取后解码.
在确定参数无空格的情况下, H5 端将获取的参数用加号替换掉空格.
还有点存疑
url 中的 空格会自动编码, 但 加号 在某些站点会编码, 某些又不会.
3.jpg
这不是第一个坑, 也不会是最后一个坑, 未完待续......
来源: http://www.jianshu.com/p/ba4c0199d06f