笔者所用的开发技术:Java、JSP

问题描述

微信服务号网页程序,打开一个页面时,如果用户还未登录微信,自动调用微信登录服务,再回到之前的页面。这时如果点手机上的后退按钮,就会又调用一次微信的登录服务,重复登录一次。每次点回退都是如此,像是陷入死循环一样。

问题分析

一、登录的过程:

1)JSP网页中检测到用户尚未登录,于是 跳转到微信登录服务,

2)微信登录服务程序让客户端跳转到回调url(一个servlet)

3)处理登录的servlet接受code和state参数,有了code再结合appid和密钥,就能获得微信用户的openId。

二、在回退过程中发生了什么?

经反复调试发现,其实是调用了在步骤1)时的jsp网页的缓存,你以为jsp中的程序会再计算一遍?其实没有,只是得到了第一次计算的结果。

问题的解决

为了避免访问前一次jsp网页缓存,笔者在第一次jsp输出内容中,增加了修改 history的state的 js 语句,这样一来,回退时访问的就是一个不同的url,这样就不会只访问缓存了,jsp会重新计算一遍,就知道当前已经登录,不会再次跳转登录了。

jsp中输出的js脚本:

<script>
var q = location.search; if(q){ q+='&t=1'} else { q='?t=1' }; 
history.replaceState(null,null,q);
location.replace('https://open.weixin.qq.com/...略');
</script>

顺便一提的还有一个小窍门——为了减少不必要的history记录,可以尽量把 response.sendRedirect() 改为 输出js脚本 location.replace(),两者同样可以跳转,但是后者不会产生新的 history 记录(也不是绝对不产生,有的时候还是会产生,绝对不产生的话也不会有本文讨论的问题了)

花了3~4个小时才解决这个bug,希望如果你也遇到这个问题,可以看过这篇后少走一点弯路。

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐