摘要:對于這個頁面,如果微信用戶沒有系統(tǒng)角色,則跳轉到登錄頁。令人憂桑的是,微信小程序并沒有提供針對實例的中間件機制。即使用戶身份校驗不通過,小程序也并不會阻塞頁面的渲染。
場景
小程序有52個頁面,其中13個頁面無需任何身份,另外39個頁面需要系統(tǒng)角色。對于這39個頁面,如果微信用戶沒有系統(tǒng)角色,則跳轉到登錄頁。
是否有系統(tǒng)角色信息需要通過異步請求來獲取。
需求分析&實現對需求進行抽象,其實要的就是一個過濾器,對小程序頁面的訪問進行過濾,符合條件的通過,不符合條件進行其他處理。
使用過php的laravel框架的童鞋,肯定一下子就聯(lián)想到了laravel框架的http中間件:
HTTP 中間件提供一個方便的機制來過濾進入應用程序的 HTTP 請求,例如,Laravel 默認包含了一個中間件來檢驗用戶身份驗證,如果用戶沒有經過身份驗證,中間件會將用戶導向登錄頁面,然而,如果用戶通過身份驗證,中間件將會允許這個請求進一步繼續(xù)前進。當然,除了身份驗證之外,中間件也可以被用來執(zhí)行各式各樣的任務,CORS 中間件負責替所有即將離開程序的響應加入適當的響應頭,一個日志中間件可以記錄所有傳入應用程序的請求。
令人憂桑的是,微信小程序并沒有提供針對Page實例的中間件機制。所以只能從Page實例的生命周期處下手。
對于onLoad,一個頁面只會調用一次;對于onShow,每次打開頁面(比如小程序從后臺轉到前臺)都會調用一次。
在onLoad或者onShow鉤子函數里,對用戶身份進行校驗,通過后則拉取該頁面需要的數據,否則跳轉到登錄頁。
//orderDetail.js onShow: function () { let that = this; //身份校驗 service.identityCheck(() => { //跳轉到登錄頁 wx.redirectTo({ url: "/pages/common/login/login" }); }, () => { //獲取頁面數據等等 that.getDetail(this.orderId); ... } ); },
不過,每個頁面都要這樣寫,重復代碼好多啊,侵入性也強。不如用裝飾函數(高大上的說法是裝飾者模式)來包裝一下:
//filter.js function identityFilter(pageObj){ if(pageObj.onShow){ let _onShow = pageObj.onShow; pageObj.onShow = function(){ service.identityCheck(()=>{ //跳轉到登錄頁 wx.redirectTo({ url: "/pages/common/login/login" }); },()=>{ //獲取頁面實例,防止this劫持 let currentInstance = getPageInstance(); _onShow.call(currentInstance); }); } } return pageObj; } function getPageInstance(){ var pages = getCurrentPages(); return pages[pages.length - 1]; } exports.identityFilter = identityFilter;
filter.js用以提供過濾器方法,除了現有的用戶身份攔截,后續(xù)如果需要其他攔截,可以在這個文件增加。然后,在需要用戶身份攔截的小程序頁面代碼里,用filter.identityFilter處理一下就可以了:
//orderDetail.js let filter = require("filter.js"); Page(filter.identityFilter({ ... onShow: function () { //獲取頁面數據等等 this.getDetail(this.orderId); //... }, ... }));使用Promise進行優(yōu)化
上面的實現中,每次訪問頁面,都會執(zhí)行一次獲取用戶身份的方法(就是上面代碼里的service. identityCheck )。其實沒有必要,在小程序啟動的時候獲取一次就行了。也就是說,放在app.js的onLaunch方法里執(zhí)行。
每個小程序頁面實例化時,一般也會執(zhí)行異步方法,用來獲取頁面需要的數據。關鍵在于,我們需要保證,頁面的異步方法 必須在 獲取用戶身份的異步請求 之后執(zhí)行。
毋容置疑,Promise最擅長處理異步請求的執(zhí)行順序了。主子,快放代碼粗來:
//app.js App({ onLaunch:function(){ let p = new Promise(function(resolve,reject){ service.identityCheck(resolve,reject); }); this.globalData.promise = p; }, ... globalData: { promise:null, } });
//filter.js const appData = getApp().globalData; function identityFilter(pageObj){ if(pageObj.onShow){ let _onShow = pageObj.onShow; pageObj.onShow = function(){ //改動點 appData.promise.then(()=>{ //跳轉到登錄頁 wx.redirectTo({ url: "/pages/common/login/login" }); },()=>{ //獲取頁面實例,防止this劫持 let currentInstance = getPageInstance(); _onShow.call(currentInstance); }); } } return pageObj; }小結
基本實現了小程序頁面的用戶身份攔截器,但是比起laravel的http中間件還是遜色一些:
需要對每個頁面代碼包裝一層。
即使用戶身份校驗不通過,小程序也并不會阻塞頁面的渲染。假如獲取用戶身份的異步方法一分鐘才執(zhí)行完,小程序頁面還是會展示出來,一分鐘之后才跳轉到登錄頁。需要自己增加邏輯,比如在這一分鐘內,頁面展示空白內容。
嗯,對小程序的新特性保持關注,后面看看怎么改進~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88397.html
摘要:多端統(tǒng)一開發(fā)框架優(yōu)秀學習資源匯總官方資源項目倉庫官方文檔項目倉庫官方文檔微信小程序官方文檔百度智能小程序官方文檔支付寶小程序官方文檔字節(jié)跳動小程序官方文檔文章教程不敢閱讀包源碼帶你揭秘背后的哲學從到構建適配不同端微信小程序等的應用小程序最 Awesome Taro 多端統(tǒng)一開發(fā)框架 Taro 優(yōu)秀學習資源匯總 showImg(https://segmentfault.com/img/r...
摘要:同時,還要攔截微信發(fā)生網絡請求的方法,這樣可以拿到網絡請求相關的數據,最后,為了能統(tǒng)計到錯誤,還需要攔截微信發(fā)生錯誤的方法。 某些情況下我們需要對小程序某些用戶的行為進行數據進行統(tǒng)計,比如統(tǒng)計某個頁面的UV,PV等,統(tǒng)計某個功能的使用情況等。好讓產品對于產品的整個功能有所了解。在網頁里,我們很多人都用過谷歌統(tǒng)計,小程序里也有一些第三方數據統(tǒng)計的庫, 比如騰訊的MTA等等。但是,第三方的...
摘要:原理架構作為與之間相互通信的橋梁部分在環(huán)境中注入的實現代碼,包含了協(xié)議的拼裝發(fā)送參數池回調池等一些基礎功能。部分在客戶端中的功能映射代碼,實現了攔截與解析環(huán)境信息的注入通用功能映射等功能。 原理架構 JSBridge 作為native 與 JS 之間相互通信的橋梁JS部分(bridge): 在JS環(huán)境中注入 bridge 的實現代碼,包含了協(xié)議的拼裝/發(fā)送/參數池/回調池等一些基礎功能...
摘要:傳統(tǒng)的網頁編程采用的三劍客來實現,在微信小程序中同樣有三劍客。觀察者模式不難實現,重點是如何在微信小程序中搭配其特有的生命周期來使用。交互事件傳統(tǒng)的事件傳遞類型有冒泡型與捕獲型,微信小程序中自然也有。 本文由作者鄒永勝授權網易云社區(qū)發(fā)布。 簡介為了更好的展示我們即時通訊SDK強悍的能力,網易云信IM SDK微信小程序DEMO的開發(fā)就提上了日程。用產品的話說就是: 云信 IM 小程序 S...
摘要:博客地址使用模塊化工具打包自己開發(fā)的庫文章中有提到,當時需要寫一個,監(jiān)控小程序的后臺接口調用和頁面報錯,今天就來說下實現原理吧原理之前也做過瀏覽器端的數據埋點上報,其實原理大同小異通過劫持原始方法,獲取需要上報的數據,最后再執(zhí)行原始方法,這 博客地址 《使用模塊化工具打包自己開發(fā)的JS庫》文章中有提到,當時需要寫一個SDK,監(jiān)控小程序的后臺接口調用和頁面報錯,今天就來說下實現原理吧! ...
閱讀 3541·2021-11-22 11:59
閱讀 947·2021-09-27 13:36
閱讀 3608·2021-09-24 09:47
閱讀 2255·2021-09-01 11:39
閱讀 974·2021-08-31 09:37
閱讀 2308·2021-08-05 10:01
閱讀 1670·2019-08-30 15:55
閱讀 699·2019-08-30 15:54