摘要:正經(jīng)寫(xiě)文章平時(shí)開(kāi)發(fā)里,先請(qǐng)求一個(gè),然后后面的請(qǐng)求都要帶上這個(gè)來(lái)進(jìn)行認(rèn)證或者授權(quán),是一個(gè)常見(jiàn)的需求那要怎么搞呢還是一個(gè)先后,控制異步流程的的問(wèn)題,就是先拿到再進(jìn)行后面的請(qǐng)求就好了。
正經(jīng)寫(xiě)文章
平時(shí)開(kāi)發(fā)里,先請(qǐng)求一個(gè) token ,然后后面的請(qǐng)求都要帶上這個(gè) token 來(lái)進(jìn)行認(rèn)證或者授權(quán),是一個(gè)常見(jiàn)的需求
那要怎么搞呢?還是一個(gè)先后,控制異步流程的的問(wèn)題,就是先拿到 token 再進(jìn)行后面的請(qǐng)求就好了。相信 promise 大家已經(jīng)用得很泛濫了:
let tokenPromise = new Promise(...) // 拿到 token tokenPromise.then()... // 拿到 token 后去拿數(shù)據(jù)1 tokenPromise.then()... // 拿到 token 后去拿數(shù)據(jù)2 tokenPromise.then()... // 拿到 token 后去拿數(shù)據(jù)3 ...
如果向上面這樣組織那就完全沒(méi)問(wèn)題了。但是實(shí)際上一般也不會(huì)這樣寫(xiě)吧,好蠢。。。但是計(jì)算機(jī)就是用來(lái)幫我們做這種蠢的重復(fù)性工作的,我們稍微變通一下,原理還是一樣,只是代碼寫(xiě)好看或者寫(xiě)少一點(diǎn)就好了
假設(shè)我們都是用 XMLHttpRequest 來(lái)發(fā)起請(qǐng)求的話(huà)(誰(shuí)能告訴我為什么XML是大寫(xiě)Http卻不是。。。),我們可以在 xhr.send() 上做點(diǎn)手腳,把這個(gè)函數(shù)再包多一層,在里面叫它幫我們調(diào)用 tokenPromise.then()。先做好準(zhǔn)備工作:
首先我先用 easy-mock 模擬了兩個(gè)接口,一個(gè)返回 token,一個(gè)返回 message
https://easy-mock.com/mock/5b8fea568eee36669a6b5523/example/token { "data": { "token": "a_mock_token" } } https://easy-mock.com/mock/5b8fea568eee36669a6b5523/example/message { "data": { "message": "你好" } }
然后用 jQuery 的 ajax 發(fā)請(qǐng)求(只要是用了 XMLHttpRequest 對(duì)象,都o(jì)k):
接下來(lái)可以寫(xiě)代碼了
// 先拿 token var tokenPromise = new Promise((resovle, reject) => { // 清除緩存里的token localStorage.removeItem("token") $.ajax({ type: "GET", url: "https://easy-mock.com/mock/5b8fea568eee36669a6b5523/example/token", success(res) { let token = res.data.token localStorage.setItem("token", token) resovle(token) }, fail(err) { reject(err) } }) }) // 對(duì) xhr.send 再包多一層 var originSend = XMLHttpRequest.prototype.send XMLHttpRequest.prototype.send = function () { var args = arguments var self = this var fn = function () { var token = localStorage.getItem("token") // 假如把 token 放在請(qǐng)求頭里 self.setRequestHeader("token", token) console.log("后續(xù)請(qǐng)求token: ", token) originSend.apply(self, args) } // tokenPromise resolved 了才會(huì)執(zhí)行后續(xù)的請(qǐng)求 tokenPromise.then(fn) } // 后續(xù)其他請(qǐng)求, Network 看一下,請(qǐng)求已經(jīng)帶上 token 了 $.ajax({ type: "GET", url: "https://easy-mock.com/mock/5b8fea568eee36669a6b5523/example/message", success(res) { console.log(res) }, fail(err) { console.log(err) } })
完整的代碼
當(dāng)然這只是一個(gè)大概的思路,你要用 axios 而不用 $.ajax ,或者是在小程序里對(duì) wx.request() 包多一層而不是對(duì) xhr.send() 包多一層都是類(lèi)似的。希望我們能寫(xiě)出更多野雞的寫(xiě)法
自言自語(yǔ)最近在認(rèn)真學(xué)習(xí) promise,覺(jué)得 史上最易讀懂的 Promise/A+ 完全實(shí)現(xiàn) 這篇文章真的挺棒的,起碼能看懂一點(diǎn)了
然后有看到 fly (一個(gè)類(lèi)似于axios的ajax庫(kù))直接就把我們上述這個(gè)先請(qǐng)求 token 的功能寫(xiě)在文檔里了,并且這個(gè)作者還寫(xiě)了一個(gè) Ajax-hook 來(lái)攔截 ajax 請(qǐng)求
所以就強(qiáng)行給博客拔拔草 :D
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/97458.html
摘要:安全機(jī)制的設(shè)計(jì)現(xiàn)在,大部分的接口都采用架構(gòu),最重要的一個(gè)設(shè)計(jì)原則就是,客戶(hù)端與服務(wù)器的交互在請(qǐng)求之間是無(wú)狀態(tài)的,也就是說(shuō),當(dāng)涉及到用戶(hù)狀態(tài)時(shí),每次請(qǐng)求都要帶上身份驗(yàn)證信息。 App與服務(wù)器的通信接口如何設(shè)計(jì)得好,需要考慮的地方挺多的,在此根據(jù)我的一些經(jīng)驗(yàn)做一些總結(jié)分享,旨在拋磚引玉。 安全機(jī)制的設(shè)計(jì) 現(xiàn)在,大部分App的接口都采用RESTful架構(gòu),RESTFul最重要的一個(gè)設(shè)計(jì)原則就...
摘要:到這里,基于的前后端分離實(shí)現(xiàn)方案就搞定啦四關(guān)于的一些思考實(shí)際上,在使用的過(guò)程中有一個(gè)比較致命的缺點(diǎn),就是一旦簽發(fā)了,在到期之前就會(huì)始終有效,除非服務(wù)器部署額外的邏輯。結(jié)語(yǔ)以上是關(guān)于基于的前后端分離實(shí)現(xiàn)方案的總結(jié)和思考。 一、jwt是什么 JWT全稱(chēng), JSON Web Token,是一個(gè)以JSON為基準(zhǔn)的標(biāo)準(zhǔn)規(guī)范。 舉例:服務(wù)器認(rèn)證以后,生成一個(gè) JSON 對(duì)象,發(fā)回給用戶(hù),就像下...
摘要:路由之身份認(rèn)證一身份認(rèn)證簡(jiǎn)介是目前最流行的跨域身份驗(yàn)證解決方案,相較于機(jī)制,服務(wù)器就不需要保存任何數(shù)據(jù)了,也就是說(shuō),服務(wù)器變成無(wú)狀態(tài)了,從而比較容易實(shí)現(xiàn)擴(kuò)展。 Vue路由之JWT身份認(rèn)證 一、JWT身份認(rèn)證簡(jiǎn)介 JSON Web Token(JWT)是目前最流行的跨域身份驗(yàn)證解決方案,相較于session機(jī)制,服務(wù)器就不需要保存任何 session 數(shù)據(jù)了,也就是說(shuō),服務(wù)器變成無(wú)狀態(tài)...
摘要:下面也是以模塊的模塊集為例,可以發(fā)現(xiàn)和路由有一些不同就是這里為了防止模塊跟全局耦合,運(yùn)用函數(shù)式編程思想類(lèi)似于依賴(lài)注入,將全局的實(shí)例作為函數(shù)參數(shù)傳入,再返回出一個(gè)包含的對(duì)象,這個(gè)導(dǎo)出的對(duì)象將會(huì)被以模塊名命名,合并到全局的集中。 前言 web前端發(fā)展到現(xiàn)代,已經(jīng)不再是嚴(yán)格意義上的后端MVC的V層,它越來(lái)越向類(lèi)似客戶(hù)端開(kāi)發(fā)的方向發(fā)展,已獨(dú)立擁有了自己的MVVM設(shè)計(jì)模型。前后端的分離也使前端人...
摘要:下面也是以模塊的模塊集為例,可以發(fā)現(xiàn)和路由有一些不同就是這里為了防止模塊跟全局耦合,運(yùn)用函數(shù)式編程思想類(lèi)似于依賴(lài)注入,將全局的實(shí)例作為函數(shù)參數(shù)傳入,再返回出一個(gè)包含的對(duì)象,這個(gè)導(dǎo)出的對(duì)象將會(huì)被以模塊名命名,合并到全局的集中。 前言 web前端發(fā)展到現(xiàn)代,已經(jīng)不再是嚴(yán)格意義上的后端MVC的V層,它越來(lái)越向類(lèi)似客戶(hù)端開(kāi)發(fā)的方向發(fā)展,已獨(dú)立擁有了自己的MVVM設(shè)計(jì)模型。前后端的分離也使前端人...
閱讀 3389·2021-11-08 13:12
閱讀 2857·2021-10-15 09:41
閱讀 1530·2021-10-08 10:05
閱讀 3356·2021-10-08 10:04
閱讀 2189·2021-09-29 09:34
閱讀 2613·2019-08-30 15:55
閱讀 3042·2019-08-30 15:45
閱讀 2675·2019-08-29 14:17