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