Vue-前端實(shí)現(xiàn)登陸攔截

前言

該項(xiàng)目是利用了Github 提供的personal token作為登錄token剂碴,通過token訪問你的Repository List蹦渣。通過這個(gè)項(xiàng)目學(xué)習(xí)如何實(shí)現(xiàn)一個(gè)前端項(xiàng)目中所需要的 登錄及攔截宪潮、登出纪他、token失效的攔截及對(duì)應(yīng) axios 攔截器的使用蛛倦。

準(zhǔn)備

你需要先生成自己的 Github Personal Token(生成Token)桶至。 Token 生成后 訪問 Demo昼伴,即可查看你的Repository List。

項(xiàng)目結(jié)構(gòu)

.
├── README.md
├── dist  // 打包構(gòu)建后的文件夾
│   ├── build.js
│   └── build.js.map
├── index.html
├── package.json
├── src
│   ├── App.vue
│   ├── assets
│   │   ├── css.css
│   │   ├── icon.css
│   │   └── logo.png
│   ├── constant
│   │   └── api.js  // 配置api接口文件
│   ├── http.js // 封裝fetch镣屹、post請(qǐng)求及http 攔截器配置文件
│   ├── index.vue
│   ├── login.vue
│   ├── main.js
│   ├── repository.vue
│   ├── router.js // 路由配置文件
│   └── store
│       ├── store.js  
│       └── types.js  // vuex types
└── webpack.config.js

技術(shù)棧

  • Vue 2.0
  • vue-router
  • vuex
  • axios
  • vue-material

登錄攔截邏輯

第一步:路由攔截

首先在定義路由的時(shí)候就需要多添加一個(gè)自定義字段requireAuth圃郊,用于判斷該路由的訪問是否需要登錄。如果用戶已經(jīng)登錄女蜈,則順利進(jìn)入路由持舆, 否則就進(jìn)入登錄頁(yè)面。

const routes = [
    {
        path: '/',
        name: '/',
        component: Index
    },
    {
        path: '/repository',
        name: 'repository',
        meta: {
            requireAuth: true,  // 添加該字段伪窖,表示進(jìn)入這個(gè)路由是需要登錄的
        },
        component: Repository
    },
    {
        path: '/login',
        name: 'login',
        component: Login
    }
];

定義完路由后吏廉,我們主要是利用vue-router提供的鉤子函數(shù)beforeEach()對(duì)路由進(jìn)行判斷。

router.beforeEach((to, from, next) => {
    if (to.meta.requireAuth) {  // 判斷該路由是否需要登錄權(quán)限
        if (store.state.token) {  // 通過vuex state獲取當(dāng)前的token是否存在
            next();
        }
        else {
            next({
                path: '/login',
                query: {redirect: to.fullPath}  // 將跳轉(zhuǎn)的路由path作為參數(shù)惰许,登錄成功后跳轉(zhuǎn)到該路由
            })
        }
    }
    else {
        next();
    }
})

每個(gè)鉤子方法接收三個(gè)參數(shù):

  • to: Route: 即將要進(jìn)入的目標(biāo) 路由對(duì)象
  • from: Route: 當(dāng)前導(dǎo)航正要離開的路由
  • next: Function: 一定要調(diào)用該方法來 resolve 這個(gè)鉤子席覆。執(zhí)行效果依賴 next 方法的調(diào)用參數(shù)。
    • next(): 進(jìn)行管道中的下一個(gè)鉤子汹买。如果全部鉤子執(zhí)行完了佩伤,則導(dǎo)航的狀態(tài)就是 confirmed (確認(rèn)的)。
    • next(false): 中斷當(dāng)前的導(dǎo)航晦毙。如果瀏覽器的 URL 改變了(可能是用戶手動(dòng)或者瀏覽器后退按鈕)生巡,那么 URL 地址會(huì)重置到 from 路由對(duì)應(yīng)的地址。
    • next('/') 或者 next({ path: '/' }): 跳轉(zhuǎn)到一個(gè)不同的地址见妒。當(dāng)前的導(dǎo)航被中斷孤荣,然后進(jìn)行一個(gè)新的導(dǎo)航。

確保要調(diào)用 next 方法,否則鉤子就不會(huì)被 resolved盐股。

完整的方法見/src/router.js

其中钱豁,to.meta中是我們自定義的數(shù)據(jù),其中就包括我們剛剛定義的requireAuth字段疯汁。通過這個(gè)字段來判斷該路由是否需要登錄權(quán)限牲尺。需要的話,同時(shí)當(dāng)前應(yīng)用不存在token幌蚊,則跳轉(zhuǎn)到登錄頁(yè)面谤碳,進(jìn)行登錄。登錄成功后跳轉(zhuǎn)到目標(biāo)路由溢豆。

登錄攔截到這里就結(jié)束了嗎蜒简?并沒有。這種方式只是簡(jiǎn)單的前端路由控制漩仙,并不能真正阻止用戶訪問需要登錄權(quán)限的路由臭蚁。還有一種情況便是:當(dāng)前token失效了,但是token依然保存在本地讯赏。這時(shí)候你去訪問需要登錄權(quán)限的路由時(shí)垮兑,實(shí)際上應(yīng)該讓用戶重新登錄。 這時(shí)候就需要結(jié)合 http 攔截器 + 后端接口返回的http 狀態(tài)碼來判斷漱挎。

第二步:攔截器

要想統(tǒng)一處理所有http請(qǐng)求和響應(yīng)系枪,就得用上 axios 的攔截器。通過配置http response inteceptor磕谅,當(dāng)后端接口返回401 Unauthorized(未授權(quán))私爷,讓用戶重新登錄。

// http request 攔截器
axios.interceptors.request.use(
    config => {
        if (store.state.token) {  // 判斷是否存在token膊夹,如果存在的話衬浑,則每個(gè)http header都加上token
            config.headers.Authorization = `token ${store.state.token}`;
        }
        return config;
    },
    err => {
        return Promise.reject(err);
    });

// http response 攔截器
axios.interceptors.response.use(
    response => {
        return response;
    },
    error => {
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    // 返回 401 清除token信息并跳轉(zhuǎn)到登錄頁(yè)面
                    store.commit(types.LOGOUT);
                    router.replace({
                        path: 'login',
                        query: {redirect: router.currentRoute.fullPath}
                    })
            }
        }
        return Promise.reject(error.response.data)   // 返回接口返回的錯(cuò)誤信息
    });

完整的方法見/src/http.js.

通過上面這兩步,就可以在前端實(shí)現(xiàn)登錄攔截了放刨。登出功能也就很簡(jiǎn)單工秩,只需要把當(dāng)前token清除,再跳轉(zhuǎn)到首頁(yè)即可进统。

如果想實(shí)現(xiàn)登陸完成之后調(diào)回到之前想要進(jìn)的頁(yè)面
只需在登陸頁(yè)的跳轉(zhuǎn)處添加如下判斷

if(!!this.$route.query.redirect){
      this.$router.push(this.$route.query.redirect)//這里是攔截前想跳轉(zhuǎn)的頁(yè)面
    }else{
      this.$router.push('/home')//這里填你默認(rèn)跳轉(zhuǎn)的地址
     }

源碼位置 https://github.com/superman66/vue-axios-github
部分內(nèi)容轉(zhuǎn)自https://blog.csdn.net/sky786905664/article/details/73920725
再次感謝作者分享

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末助币,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子螟碎,更是在濱河造成了極大的恐慌眉菱,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掉分,死亡現(xiàn)場(chǎng)離奇詭異俭缓,居然都是意外死亡克伊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門华坦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愿吹,“玉大人,你說我怎么就攤上這事季春。” “怎么了消返?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵载弄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我撵颊,道長(zhǎng)宇攻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任倡勇,我火速辦了婚禮逞刷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妻熊。我一直安慰自己夸浅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布扔役。 她就那樣靜靜地躺著帆喇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亿胸。 梳的紋絲不亂的頭發(fā)上坯钦,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音侈玄,去河邊找鬼婉刀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛序仙,可吹牛的內(nèi)容都是我干的突颊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼潘悼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼洋丐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挥等,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤友绝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肝劲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迁客,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郭宝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掷漱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粘室。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卜范,靈堂內(nèi)的尸體忽然破棺而出衔统,到底是詐尸還是另有隱情,我是刑警寧澤海雪,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布锦爵,位于F島的核電站,受9級(jí)特大地震影響奥裸,放射性物質(zhì)發(fā)生泄漏险掀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一湾宙、第九天 我趴在偏房一處隱蔽的房頂上張望樟氢。 院中可真熱鬧,春花似錦侠鳄、人聲如沸埠啃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)霸妹。三九已至,卻和暖如春知押,著一層夾襖步出監(jiān)牢的瞬間叹螟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工台盯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留罢绽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓静盅,卻偏偏與公主長(zhǎng)得像良价,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蒿叠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容