欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

小程序頁(yè)面之用戶身份校驗(yàn) - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識(shí)

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!

您當(dāng)前位置>首頁(yè) » 新聞資訊 » 小程序相關(guān) >

小程序頁(yè)面之用戶身份校驗(yàn)

發(fā)表時(shí)間:2021-4-30

發(fā)布人:葵宇科技

瀏覽次數(shù):117

場(chǎng)景

  1. 小程序有52個(gè)頁(yè)面,其中13個(gè)頁(yè)面無(wú)需任何身份,另外39個(gè)頁(yè)面需要系統(tǒng)角色。對(duì)于這39個(gè)頁(yè)面,如果微信用戶沒(méi)有系統(tǒng)角色,則跳轉(zhuǎn)到登錄頁(yè)。
  2. 是否有系統(tǒng)角色信息需要通過(guò)異步請(qǐng)求來(lái)獲取。

需求分析&實(shí)現(xiàn)

對(duì)需求進(jìn)行抽象,其實(shí)要的就是一個(gè)過(guò)濾器,對(duì)小程序頁(yè)面的訪問(wèn)進(jìn)行過(guò)濾,符合條件的通過(guò),不符合條件進(jìn)行其他處理。

使用過(guò)php的laravel框架的童鞋,肯定一下子就聯(lián)想到了laravel框架的http中間件:
HTTP 中間件提供一個(gè)方便的機(jī)制來(lái)過(guò)濾進(jìn)入應(yīng)用程序的 HTTP 請(qǐng)求,例如,Laravel 默認(rèn)包含了一個(gè)中間件來(lái)檢驗(yàn)用戶身份驗(yàn)證,如果用戶沒(méi)有經(jīng)過(guò)身份驗(yàn)證,中間件會(huì)將用戶導(dǎo)向登錄頁(yè)面,然而,如果用戶通過(guò)身份驗(yàn)證,中間件將會(huì)允許這個(gè)請(qǐng)求進(jìn)一步繼續(xù)前進(jìn)。當(dāng)然,除了身份驗(yàn)證之外,中間件也可以被用來(lái)執(zhí)行各式各樣的任務(wù),CORS 中間件負(fù)責(zé)替所有即將離開程序的響應(yīng)加入適當(dāng)?shù)捻憫?yīng)頭,一個(gè)日志中間件可以記錄所有傳入應(yīng)用程序的請(qǐng)求。

令人憂桑的是,微信小程序并沒(méi)有提供針對(duì)Page實(shí)例的中間件機(jī)制。所以只能從Page實(shí)例的生命周期處下手。

mina-lifecycle.png

對(duì)于onLoad,一個(gè)頁(yè)面只會(huì)調(diào)用一次;對(duì)于onShow,每次打開頁(yè)面(比如小程序從后臺(tái)轉(zhuǎn)到前臺(tái))都會(huì)調(diào)用一次。

onLoad或者onShow鉤子函數(shù)里,對(duì)用戶身份進(jìn)行校驗(yàn),通過(guò)后則拉取該頁(yè)面需要的數(shù)據(jù),否則跳轉(zhuǎn)到登錄頁(yè)。

  1. //orderDetail.js
  2. onShow: function () {
  3. let that = this;
  4. //身份校驗(yàn)
  5. service.identityCheck(() => {
  6. //跳轉(zhuǎn)到登錄頁(yè)
  7. wx.redirectTo({
  8. url: "/pages/common/login/login"
  9. });
  10. }, () => {
  11. //獲取頁(yè)面數(shù)據(jù)等等
  12. that.getDetail(this.orderId);
  13. ...
  14. }
  15. );
  16. },

不過(guò),每個(gè)頁(yè)面都要這樣寫,重復(fù)代碼好多啊,侵入性也強(qiáng)。不如用裝飾函數(shù)(高大上的說(shuō)法是裝飾者模式)來(lái)包裝一下:

  1. //filter.js
  2. function identityFilter(pageObj){
  3. if(pageObj.onShow){
  4. let _onShow = pageObj.onShow;
  5. pageObj.onShow = function(){
  6. service.identityCheck(()=>{
  7. //跳轉(zhuǎn)到登錄頁(yè)
  8. wx.redirectTo({
  9. url: "/pages/common/login/login"
  10. });
  11. },()=>{
  12. //獲取頁(yè)面實(shí)例,防止this劫持
  13. let currentInstance = getPageInstance();
  14. _onShow.call(currentInstance);
  15. });
  16. }
  17. }
  18. return pageObj;
  19. }
  20. function getPageInstance(){
  21. var pages = getCurrentPages();
  22. return pages[pages.length - 1];
  23. }
  24. exports.identityFilter = identityFilter;

filter.js用以提供過(guò)濾器方法,除了現(xiàn)有的用戶身份攔截,后續(xù)如果需要其他攔截,可以在這個(gè)文件增加。然后,在需要用戶身份攔截的小程序頁(yè)面代碼里,用filter.identityFilter處理一下就可以了:

  1. //orderDetail.js
  2. let filter = require('filter.js');
  3. Page(filter.identityFilter({
  4. ...
  5. onShow: function () {
  6. //獲取頁(yè)面數(shù)據(jù)等等
  7. this.getDetail(this.orderId);
  8. //...
  9. },
  10. ...
  11. }));

使用Promise進(jìn)行優(yōu)化

上面的實(shí)現(xiàn)中,每次訪問(wèn)頁(yè)面,都會(huì)執(zhí)行一次獲取用戶身份的方法(就是上面代碼里的service. identityCheck)。其實(shí)沒(méi)有必要,在小程序啟動(dòng)的時(shí)候獲取一次就行了。也就是說(shuō),放在app.js的onLaunch方法里執(zhí)行。

每個(gè)小程序頁(yè)面實(shí)例化時(shí),一般也會(huì)執(zhí)行異步方法,用來(lái)獲取頁(yè)面需要的數(shù)據(jù)。關(guān)鍵在于,我們需要保證,頁(yè)面的異步方法 必須在 獲取用戶身份的異步請(qǐng)求 之后執(zhí)行。

毋容置疑,Promise最擅長(zhǎng)處理異步請(qǐng)求的執(zhí)行順序了。主子,快放代碼粗來(lái):

  1. //app.js
  2. App({
  3. onLaunch:function(){
  4. let p = new Promise(function(resolve,reject){
  5. service.identityCheck(resolve,reject);
  6. });
  7. this.globalData.promise = p;
  8. },
  9. ...
  10. globalData: {
  11. promise:null,
  12. }
  13. });
  1. //filter.js
  2. const appData = getApp().globalData;
  3. function identityFilter(pageObj){
  4. if(pageObj.onShow){
  5. let _onShow = pageObj.onShow;
  6. pageObj.onShow = function(){
  7. //改動(dòng)點(diǎn)
  8. appData.promise.then(()=>{
  9. //跳轉(zhuǎn)到登錄頁(yè)
  10. wx.redirectTo({
  11. url: "/pages/common/login/login"
  12. });
  13. },()=>{
  14. //獲取頁(yè)面實(shí)例,防止this劫持
  15. let currentInstance = getPageInstance();
  16. _onShow.call(currentInstance);
  17. });
  18. }
  19. }
  20. return pageObj;
  21. }

小結(jié)

基本實(shí)現(xiàn)了小程序頁(yè)面的用戶身份攔截器,但是比起laravel的http中間件還是遜色一些:

  1. 需要對(duì)每個(gè)頁(yè)面代碼包裝一層。
  2. 即使用戶身份校驗(yàn)不通過(guò),小程序也并不會(huì)阻塞頁(yè)面的渲染。假如獲取用戶身份的異步方法一分鐘才執(zhí)行完,小程序頁(yè)面還是會(huì)展示出來(lái),一分鐘之后才跳轉(zhuǎn)到登錄頁(yè)。需要自己增加邏輯,比如在這一分鐘內(nèi),頁(yè)面展示空白內(nèi)容。

嗯,對(duì)小程序的新特性保持關(guān)注,后面看看怎么改進(jìn)~


相關(guān)案例查看更多