借助axios的攔截器實(shí)現(xiàn)Vue.js中登陸狀態(tài)校驗(yàn)的思路

在做Vue中的登陸校驗(yàn)時(shí)亮钦,思路應(yīng)該是這樣的:先確定一個(gè)路由頁面是否需要登陸才能訪問馆截,如果需要,就需要用戶登陸,如果不需要蜡娶,用戶直接可以訪問混卵。

那么,首先來說窖张,后臺(tái)系統(tǒng)中幕随,不一定每一個(gè)頁面都要進(jìn)行登陸權(quán)限,所以我們要通過路由的meta標(biāo)簽對需要做校驗(yàn)的路由頁面做好標(biāo)記荤堪,在配置路由時(shí)合陵,我們可以在meta屬性中,加入是否需要登陸的字段澄阳,如果requireAuth是true,就說明這條路由需要登陸才能訪問:

{
  path: '/userInfo',
  name: 'userInfo',
  meta: {
    requireAuth: true,  // 該路由項(xiàng)需要權(quán)限校驗(yàn)
  }
  component: userInfo
}, {
  path: '/userList',
  name: 'userList',    // 該路由項(xiàng)不需要權(quán)限校驗(yàn)    
  component: userInfo
}
之后踏拜,我們可以定義一個(gè)路由守衛(wèi)碎赢,每次路由跳轉(zhuǎn),我們都來做一次權(quán)限校驗(yàn)速梗,參考如下代碼

router.beforeEach((to, from, next) => {
  if(to.meta.requireAuth) { // 如果路由項(xiàng)需要權(quán)限校驗(yàn)
    /* 
      從Vuex拿出token碼肮塞,說明已登陸
     (前端的token可偽造,所以這并不是完全靠譜姻锁,后面繼續(xù)說)
    */
    if (store.state.token) { 
      next() // 正常跳轉(zhuǎn)頁面
    } else {
      next({
        path: '/login',
        query: {redirect: to.fullPath}  
        /* 將跳轉(zhuǎn)的路由地址作為參數(shù)帶給登陸頁枕赵,登錄成功后跳轉(zhuǎn)回該頁面 */
      })
    }
  } else { // 如果不需要權(quán)限校驗(yàn),直接進(jìn)入路由頁面
      next();
  }
})
如果用戶的Vuex中登陸狀態(tài)(token)存在位隶,就說明登陸了拷窜,如果沒有值,就跳轉(zhuǎn)去登陸頁面涧黄。用戶在登陸頁面登陸后篮昧,要在Vuex中保存登陸狀態(tài)(token)。(實(shí)際上如果做持久存儲(chǔ)笋妥,還應(yīng)該把登陸狀態(tài)存在localStorage或者cookie中)

然而懊昨,單純這么來做并不靠譜,首先春宣,token可以用戶自己偽造酵颁,其次,有可能token在前端存在月帝,但是由于登陸時(shí)間過長躏惋, 已經(jīng)超出登陸最長時(shí)效期,這時(shí)嫁赏,后端中其掂,這個(gè)token已經(jīng)失效。

所以潦蝇,這么做權(quán)限校驗(yàn)并不準(zhǔn)確款熬,那么接下來深寥,我們可以在發(fā)請求的時(shí)候,通過后端的一層校驗(yàn)贤牛,進(jìn)一步確保權(quán)限狀態(tài)的準(zhǔn)確性惋鹅。

這一步,要用到axios里面的攔截器殉簸,所以以下代碼建立在項(xiàng)目使用axios的基礎(chǔ)上闰集。axios的攔截器(Interceptors),默認(rèn)配置(axios.defaults)還有 axios.create() 創(chuàng)建出的實(shí)例實(shí)際上在封裝請求時(shí)非常有用般卑,如果你沒接觸過武鲁,趕緊到官方文檔看一下!

我們先來看蝠检,在每次請求時(shí)沐鼠,我們進(jìn)行如下的攔截,這么做的意思是叹谁,如果前端有token饲梭,我每次都把token給后端,后端拿到這個(gè)token后會(huì)到后端再進(jìn)行一次權(quán)限校驗(yàn)焰檩,然后把校驗(yàn)結(jié)果在接口中反饋:

axios.interceptors.request.use( requestConfig => {
  if (store.state.token) {
    config.headers.Authorization = `${store.state.token}`;
  }
  return requestConfig;
}, err => {
  return Promise.reject(err);
});
然后我們再來看憔涉,對應(yīng)一定要再寫一個(gè)response攔截器,處理響應(yīng)數(shù)據(jù)析苫。如果后端拿到前端的token兜叨,發(fā)現(xiàn)token失效,我們要求后端接口返回401的返回碼藤违,這樣浪腐,前端就可以這么處理了:

axios.interceptors.response.use( response => {
    return response;
  }, error => {
    if (error.response) {
      switch (error.response.status) {
        case 401:  
          /* 
            返回 401 表示前端的token已失效
            當(dāng)然,你也可以和后端也定其他的方式來表示token失效
            需要前端清除Vuex中的token顿乒,頁面跳轉(zhuǎn)到登陸頁
          */ 
          store.commit(types.LOGOUT);
          router.replace({
            path: 'login',
            query: {
              redirect: router.currentRoute.fullPath
            }
          })
      }
    }
    return Promise.reject(error.response.data) //返回接口返回的錯(cuò)誤信息
});

借助axios的攔截器议街,我們不但前端做了登陸校驗(yàn),而且每次請求后端接口的時(shí)候璧榄,都會(huì)攜帶數(shù)據(jù)讓后端再次做登陸校驗(yàn)特漩,這樣的一個(gè)登陸校驗(yàn)流程就很標(biāo)準(zhǔn)了。

這篇文章寫的稍微有些寬骨杂,大家看到哪里不太明白隨時(shí)提問涂身,我再展開來講。

作者:DellLee
鏈接:https://www.imooc.com/article/25167?block_id=tuijian_wz
來源:慕課網(wǎng)

2搓蚪、第二篇有關(guān)vue中axios的文章
https://segmentfault.com/a/1190000016787376

在Vue中如何使用axios請求攔截

為什么要使用請求攔截蛤售?
如果不使用請求攔截,那么對每一條請求每一個(gè)狀態(tài)都要特殊處理,如果請求特殊狀態(tài)有數(shù)十個(gè)悴能,每個(gè)頁面有很多請求揣钦,那么頁面會(huì)變得很長很臃腫,不好維護(hù)漠酿。
下面是一個(gè)沒有請求攔截的例子:

//雙向數(shù)據(jù)綁定獲取值
let httpRequest = {};
httpRequest.loginName = this.loginName
httpRequest.password= this.password

this.$axios.post("/api/request", this.$qs.stringify(httpRequest)).then(data => {
    //特殊錯(cuò)誤處理冯凹,狀態(tài)為10時(shí)為登錄超時(shí)
    if(data.data.code === 10){
        this.$Message.error("登錄已超時(shí),請重新登錄")
        this.$router.push("/login")
    //其余錯(cuò)誤狀態(tài)處理    
    }else if(data.data.code != 0){
        this.$Message.error(data.data.msg)
    //請求成功
    }else if(data.data.code === 0){
        //進(jìn)行成功業(yè)務(wù)邏輯
    }
    //.......
});

main.js

//請求發(fā)送攔截炒嘲,把數(shù)據(jù)發(fā)送給后臺(tái)之前做些什么......
axios.interceptors.request.use((request) => {

  //這個(gè)例子中data是loginName和password
  let REQUEST_DATA = request.data
  //統(tǒng)一進(jìn)行qs模塊轉(zhuǎn)換
  request.data = qs.stringify(REQUEST_DATA)
  //再發(fā)送給后臺(tái)
  return request;

}, function (error) {
  // Do something with request error
  return Promise.reject(error);
});

//請求返回?cái)r截宇姚,把數(shù)據(jù)返回到頁面之前做些什么...
axios.interceptors.response.use((response) => {
  //特殊錯(cuò)誤處理,狀態(tài)為10時(shí)為登錄超時(shí)
  if (response.data.code === 10) {
    iView.Message.error("登錄已超時(shí)夫凸,請重新登錄");
    router.push("/login")
  //其余錯(cuò)誤狀態(tài)處理    
  } else if (response.data.code != 0) {
    iView.Message.error(response.data.msg)
  //請求成功
  } else if(response.data.code === 0){
    //將我們請求到的信息返回頁面中請求的邏輯
    return response;
  }
 //......

}, function (error) {
  return Promise.reject(error);
});

.vue

//雙向數(shù)據(jù)綁定獲取值
let httpRequest = {};
httpRequest.loginName = this.loginName
httpRequest.password= this.password

this.$axios.post("/api/request", httpRequest).then(data => {
    //這是要先判斷data浑劳,如果請求的數(shù)據(jù)狀態(tài)code不為0,會(huì)被攔截,則data為undefined
    if(data){
        //進(jìn)行請求返回成功邏輯
    }
});

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夭拌,一起剝皮案震驚了整個(gè)濱河市呀洲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啼止,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兵罢,死亡現(xiàn)場離奇詭異献烦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)卖词,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門巩那,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人此蜈,你說我怎么就攤上這事即横。” “怎么了裆赵?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵东囚,是天一觀的道長。 經(jīng)常有香客問我战授,道長页藻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任植兰,我火速辦了婚禮份帐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘楣导。我一直安慰自己废境,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著噩凹,像睡著了一般巴元。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上栓始,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天务冕,我揣著相機(jī)與錄音,去河邊找鬼幻赚。 笑死禀忆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的落恼。 我是一名探鬼主播箩退,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼佳谦!你這毒婦竟也來了戴涝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钻蔑,失蹤者是張志新(化名)和其女友劉穎啥刻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咪笑,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡可帽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窗怒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片映跟。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扬虚,靈堂內(nèi)的尸體忽然破棺而出努隙,到底是詐尸還是另有隱情,我是刑警寧澤辜昵,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布荸镊,位于F島的核電站,受9級特大地震影響路鹰,放射性物質(zhì)發(fā)生泄漏贷洲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一晋柱、第九天 我趴在偏房一處隱蔽的房頂上張望优构。 院中可真熱鬧,春花似錦雁竞、人聲如沸钦椭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彪腔。三九已至侥锦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間德挣,已是汗流浹背恭垦。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留格嗅,地道東北人番挺。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像屯掖,于是被迫代替她去往敵國和親玄柏。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355