在開(kāi)發(fā)Web應(yīng)用時(shí),經(jīng)常會(huì)遇到一個(gè)小問(wèn)題,用戶退出登錄后,再次打開(kāi)頁(yè)面,需要重新輸入賬號(hào)密碼登錄。這給用戶帶來(lái)了不必要的麻煩。而我們可以通過(guò)Vue的session自動(dòng)登錄來(lái)避免這個(gè)問(wèn)題。
session是后端用于保存用戶信息的技術(shù)。具體而言,在用戶登錄后,后端會(huì)生成一個(gè)session,保存該用戶的相關(guān)信息,然后將該session的標(biāo)識(shí)符返回給前端瀏覽器。后續(xù)的訪問(wèn),前端瀏覽器將該session標(biāo)識(shí)符傳給服務(wù)端作為驗(yàn)證,從而實(shí)現(xiàn)自動(dòng)登錄。
// 登錄 login() { // 發(fā)送請(qǐng)求到后臺(tái)進(jìn)行登錄驗(yàn)證 axios.post('/api/login', { username: this.username, password: this.password }).then(res =>{ // 后端驗(yàn)證通過(guò),設(shè)置session存儲(chǔ)信息 sessionStorage.setItem('user', JSON.stringify(res.data.user)); // 在當(dāng)前頁(yè)路由中跳轉(zhuǎn)到首頁(yè) this.$router.push({ path: '/' }); }).catch(err =>{ // 后端驗(yàn)證不通過(guò),給出錯(cuò)誤提示 this.$message.error('登錄失敗,請(qǐng)檢查用戶名和密碼!'); console.log(err); }); },
通過(guò)使用SessionStorage對(duì)象,我們可以在瀏覽器中保存用戶信息,從而實(shí)現(xiàn)自動(dòng)登錄功能。具體而言,在用戶登錄成功后,我們會(huì)將用戶信息通過(guò)sessionStorage.setItem()方法存儲(chǔ)到瀏覽器中。在重新打開(kāi)網(wǎng)頁(yè)時(shí),我們首先判斷瀏覽器中是否存在用戶信息。如存在,則直接進(jìn)行自動(dòng)登錄;如不存在,則跳轉(zhuǎn)到登錄頁(yè)。具體代碼如下:
// 進(jìn)入路由前判斷是否登錄 router.beforeEach((to, from, next) =>{ const user = JSON.parse(sessionStorage.getItem('user') || '{}'); if (to.meta.requireAuth) { if (user && user.id) { next(); } else { next({ path: '/login' }) } } else { next(); } });
通過(guò)Vue的路由鉤子beforeEach()方法,我們可以在進(jìn)入路由前對(duì)登錄狀態(tài)進(jìn)行判斷。具體而言,我們判斷用戶信息是否存在,并且用戶信息中是否包含id屬性。如果包含,則表示用戶已經(jīng)登錄,可以直接跳轉(zhuǎn)到目標(biāo)路由;如果不包含,則表示用戶尚未登錄,需要跳轉(zhuǎn)到登錄頁(yè)。
通過(guò)以上的代碼實(shí)現(xiàn),我們能夠在Vue中實(shí)現(xiàn)用戶自動(dòng)登錄功能,為用戶提供更加方便的使用體驗(yàn)。但是需要注意的是,session機(jī)制存在著一定的安全隱患,如不當(dāng)使用可能導(dǎo)致信息泄露,因此我們需要在使用session的同時(shí),加入一些必要的安全措施,如設(shè)置session過(guò)期時(shí)間,以此保證用戶信息的安全性。