微信網頁程序開發,如何解決後退時重複登錄的問題

筆者所用的開發技術: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,希望如果你也遇到這個問題,可以看過這篇後少走一點彎路。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章