微信内嵌浏览器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年全栈开发经验,请关注个人公众号

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值