剛才做公司 passport 項目的時候,登錄界面,有個重置密碼的功能痢虹,跳轉(zhuǎn)到重置密碼頁,而重置密碼后兰绣,還要調(diào)回原有的登錄頁
當(dāng)然可以用
history.back
世分,但為了保證 Url 可復(fù)制,使用代碼
登錄頁的 url 大致是這樣的:
http://passport.xxx.com/login?retUrl=http%3A%2F%2Fwww.xxx.com%2Fauth%2Ffinish%3Fr%3Dhttp%253A%252F%252Fnews.xxx.com%252Fa%252F272.html
可以看到參數(shù) retUrl
的值非常復(fù)雜缀辩,它其實是:
encodeURIComponent('http://www.xxx.com/auth/finish?r=' + encodeURIComponent('http://news.xxx.com/a/272.html'))
的結(jié)果臭埋,本來已經(jīng)過兩次 encodeURIComponent
調(diào)用了,如果再來一次臀玄,應(yīng)該也能達(dá)到目的瓢阴,但最后出了一點小問題,可能是多次 encodeURIComponent
導(dǎo)致的
不用糾結(jié)健无,換一種思路荣恐,將它轉(zhuǎn)換成 base64
,傳給重置密碼頁累贤,然后在重置密碼頁解析這個 base64
想法很 nice叠穆,但我一查,原來 base64
編碼臼膏,包含以下字符:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
看看最后的三個字符 +/=
硼被,都是 Url 敏感字符,所以:
base64
字符串不可直接作為 Url 參數(shù)值渗磅,仍需encodeURIComponent
所以嚷硫,最終的方案改為:
// 在登錄頁編碼
const retUrl = encodeURIComponent(btoa(location.href))
const resetPwdUrl = `/auth/resetPwd?retUrl=${retUrl}`
// 在重置密碼頁检访,獲取 retUrl
// 假設(shè) rawRetUrl 為參數(shù) retUrl 的原始值
const retUrl = rawRetUrl ? atob(decodeURIComponent(rawRetUrl)) : '/'
btoa
用于將原始數(shù)據(jù)編碼成base64
字符串,atob
用于解碼
瀏覽器支持情況:IE10+仔掸、所有現(xiàn)代瀏覽器
整篇完脆贵。歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處:
簡書作者:lip2up
微信公眾號:前端大牛