前提:
微信小程序是没有cookie的,我们需要手动设置header的cookie,自然cookie是存储在storage里面,然后请求接口的时候,读取storage,拼接成key=value;key=value,然后设置到header的cookie。
问题:
抓包接口,发现header有两个cookie,导致后台nginx解析异常,cookie内容拿到的都是空。一个cookie,一个Cookie。
1、玄乎之处在于当时只要连接whistle代理,请求就正常,网络切换到线上,则接口请求失败。
2、后台发现因为我页面有video播放,所以异常,如果我注释掉video,页面请求总是正常。
原因分析:
之所以微信会强制帮忙设置一个Cookie,原因是之前的接口response有set-cookie,微信检测到发现有set-cookie,但是后续的接口请求没有这个值,这里是serverid,所以就会强制加上去,
Date Thu, 21 Feb 2019 11:02:29 GMT
Content-Type text/html;charset=UTF-8
Transfer-Encoding chunked
Set-Cookie SERVERID=06a7df9c069298f7ec2cf688b5ed0ba8; Path=/
Access-Control-Allow-Credentials true
Access-Control-Allow-Methods GET, POST, OPTIONS
Cache-Control max-age=5
所以我们需要自己把set-cookie的值提前设置到header当中去,那么微信就不会再单独一个Cookie,然后设置serverid了。
1、微信的BUG,在设置cookie的时候,并未合并原来的cookie,可能代码发现是不同的cookie,(自己设置的是小写的,其实代码是大写的,只不过微信自己改成小写了)。所以新建一个Cookie
2、为啥去掉video就可以正常,其实我看了接口都有response ,set-cookie,但是微信并未强制设置这个值,唯独在视频播放的时候,就触发了这个set-cookie值校验。应该是微信Bug,感觉是想都去做set-cookie这个事情。
3、网络切换whistle代理就请求oK,线上就失败,是因为whistle接受到两个Cookie的时候,居然合并了,把手机端发出的请求的Cookie拼接在我们自己的cookie之后,中间还隔了一个空格。所以链接whistle就没问题。坑~
解决方法:
每一次wx.request之后,处理response的set-cookie,按域名保存下来(注意是看接口域名保存起来),然后发起请求的时候,再自行设置到header的cookie中去,保证只有一个cookie。
set-cookie的acw_tc和serverid都一样处理即可。