微信内嵌浏览器sessionid丢失问题

现象

微信中打开网页,图形验证码经常提示错误,即使填写正确也会提示错误,并且间歇性出现。
系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题。近期有部分用户是在微信中访问的,才出现的这个问题。

抓包

由于只有在手机微信中出现这种情况,并且手机连的无线与pc不在一个局域网中,所以,只能在pc上用360wifi创建热点(无线),然后手机连接热点,再用wireshark抓360wifi网卡,查看数据。
一个页面中的,带着sessionid发送的多次请求,响应中的sessionid会被重置,具体来说就是cookie中的信息是set-cookie:jessionid=xxxxx,并且这个set-cookie的jsessionid也不同

分析

经过测试发现
1、sessionid丢失只在微信中打开网址时才会出现,尤其在安卓的微信中,丢失次数最多,iphone中几乎不出现。
2、在手机非微信中打开,比如手机浏览器,不会出现sessionid丢失
3、在pc浏览器中,不会出现sessionid丢失

推理论证

至此,怀疑是服务器没做session保持,经查证,服务器有2个tomcat,都放在腾讯云上,做了黏性session,黏性session是通过hash ip,然后取余做的,所以怀疑是黏性session不起作用。
为了验证这个猜测,通过不断request,发现request一会到server1,一会又到server2,而且没有规律可循。由于手机的ip是固定的,并且腾讯云坚持他们的黏性session没有问题,所以推测ip在中间传输过程被修改了。经过在服务器上抓包发现,腾讯云收到的ip的确是变化的。经过以上的验证加上网上search,原来凶手是微信内嵌浏览器对所有请求都做了代理,从而导致腾讯云收到的ip发生了变化

解决

由于微信内嵌浏览器对所有请求都做了代理,导致出去的ip不固定,从而导致腾讯云服务器的黏性session(基于客户端ip做的黏性session)失效。所以,解决方案有两个,要么服务器端只用一台tomcat,要么tomcat做session共享,比如
session放在redis中。这样server1产生的sessionid,即使到了server2,也能从redis中找到。

9年全栈开发经验,请关注个人公众号

微信内嵌浏览器sessionid丢失问题_第1张图片

你可能感兴趣的:(微信,http,session)