最近做項目是,因爲某些原因修改了域名,之前域名是http開頭的,後來改成了https,接着就發生了一系列問題,首先簡單的是請求接口鏈接變了,換了一撥;後續突然出現用戶信息爲空了(請求用戶信息的接口沒有返回信息),一些列排查以後,才發現是因爲請求用戶信息接口時,openid爲null或者undefined,或者用了其他公衆號的openid,以至於接口報錯。
但是讓其他用戶有的測,發現有的用戶是這樣的問題,有的沒有問題,最後定位到是ios系統存在這樣的問題。
然後就順着openid的線索一步步聯調,發現剛進入項目用戶授權拿到了用戶的openid,並存入localStorage裏面,但是後續的頁面中從localstorage中拿出來的openid是null,很費解,這個原因至今還沒查清到底是爲什麼,不過在網上查到一些方法,就是將獲取到的openid存入cookie裏面,然後再拿出來,這樣測試的結果對了,但是有個問題是cookie大小以及時間有限,所以還在想其他辦法,等找到再繼續分享給大家。
採用cookie存的方法如下:
1、首先在vue項目index.html頁面script標籤裏面將拿到的openid,存入cookie,代碼如下:
if (location.href.split('openid').length === 2) { // 這個是後臺給的授權鏈接,點擊可以獲取到一個鏈接,然後截取裏面的openid
const arr = location.href.split(/[\?\&]/)
const obj = {}
arr.map(item => {
if (item.indexOf('=') !== -1) {
obj[item.split('=')[0]] = item.split('=')[1]
} else {
obj.baseUrl = item
}
})
document.cookie = 'openid=' + obj.openid + '; path=/' // path設置是爲了讓所有頁面都可以拿到cookie
// const openidall = document.cookie // 這裏可以拿到cookie
// alert('cookeie:' + openidall)
localStorage.setItem('openid', obj.openid) // 也將openid存入localStorage裏面一份,因爲安卓手機還是可以的
if (location.hash === '') {
location.href = location.origin + location.pathname + '/#/home'
}
}
2、在App.vue頁面將cookie裏面的openid拿出來,放到vuex狀態管理器裏面,這樣整個項目都可以從vuex裏面拿openid啦(這個具體情況具體來,可以不放vuex)
mounted () {
if (localStorage.openid !== '') { // 這個情況適用於安卓手機,可以用localStorage裏面的openid
this.$store.commit('SET_OPENID', localStorage.openid)
}
if (document.cookie.split(';')[0].split('=')[1] !== '') { // 這裏是適用於ios系統的,可以這樣取openid,放入store裏面
// alert('openid;' + document.cookie.split(';')[0].split('='))
this.$store.commit('SET_OPENID', document.cookie.split(';')[0].split('=')[1])
}
},
這樣就可以從vuex裏面拿到openid了,就可以像之前一樣用openid來請求接口操作了。
如果有設麼問題,歡迎指正~