楊亞仿,林政藝
(廣西中醫(yī)藥大學(xué),廣西 南寧 530200)
無(wú)論是哪一種小程序,基本的用戶驗(yàn)證、業(yè)務(wù)加載、流程提交等數(shù)據(jù)請(qǐng)求,都需要Web 服務(wù)端的安全驗(yàn)證與快速響應(yīng),因此,Web 服務(wù)端的數(shù)據(jù)安全和快速響應(yīng)是小程序業(yè)務(wù)的運(yùn)行基礎(chǔ)。傳統(tǒng)的互聯(lián)網(wǎng)服務(wù)器可以使用內(nèi)網(wǎng)方式進(jìn)行數(shù)據(jù)通信,但小程序和Web 服務(wù)端之間必須使用公共域名進(jìn)行數(shù)據(jù)通信或數(shù)據(jù)交換,因此小程序?qū)eb 服務(wù)端的數(shù)據(jù)安全和響應(yīng)速度有更高的要求。
本文基于實(shí)際的高校學(xué)生評(píng)教小程序項(xiàng)目,對(duì)小程序的Web服務(wù)端特點(diǎn)進(jìn)行研究與分析,對(duì)Web服務(wù)端如何保持安全、高效的運(yùn)行進(jìn)行了討論,結(jié)合具體評(píng)教業(yè)務(wù)流程,設(shè)計(jì)了一套符合該項(xiàng)目需求的Web 服務(wù)端程序,該服務(wù)端程序具備一定的通用能力,包括自定義JSON 序列化、自定義Token 驗(yàn)證,也包括適合該項(xiàng)目特點(diǎn)的課表數(shù)據(jù)緩存與同步更新機(jī)制。
互聯(lián)網(wǎng)的各種應(yīng)用均離不開Web 服務(wù)端的支持,傳統(tǒng)Web 服務(wù)端的基本功能應(yīng)包括用戶身份認(rèn)證、數(shù)據(jù)交互、數(shù)據(jù)安全、數(shù)據(jù)緩存等,小程序的Web 服務(wù)端不僅要包含以上功能,還應(yīng)在這些功能上追求更高的性能和效率,才能應(yīng)對(duì)和滿足小程序的輕量、便捷、高效等特點(diǎn)與要求。很多學(xué)者對(duì)此展開了研究與討論,并取得了一定的研究成果。
周虎通過(guò)對(duì)比傳統(tǒng)Cookie/Session 身份驗(yàn)證機(jī)制的不足,提出了一種基于JWT 認(rèn)證過(guò)程中動(dòng)態(tài)刷新Token的方法,并在Web開發(fā)中進(jìn)行了實(shí)踐應(yīng)用[1]。李毓麗等自定義了一套Token校驗(yàn)機(jī)制并利用Swoole下的WebSocket 接口實(shí)現(xiàn)了消息通知功能[2]。鄒軍國(guó)在輕量級(jí)微服務(wù)架構(gòu)思想指導(dǎo)下按照Token身份認(rèn)證原理提出了高校實(shí)訓(xùn)互動(dòng)平臺(tái)的身份認(rèn)證解決方案[3]。徐冉通過(guò)研究微服務(wù)架構(gòu),使用消息中間件與高性能緩存,研究實(shí)現(xiàn)了秒殺系統(tǒng)的Web 服務(wù)端設(shè)計(jì)[4]。張欣將知識(shí)圖譜引入小程序,面向?qū)W生個(gè)性化學(xué)習(xí)設(shè)計(jì)了認(rèn)知診斷、個(gè)人知識(shí)圖譜和課程推薦等功能,實(shí)現(xiàn)了基于微信小程序的教育知識(shí)圖譜個(gè)性化學(xué)習(xí)平臺(tái)[5]。饒煜等分析了在線學(xué)習(xí)系統(tǒng)的需求,在Web 服務(wù)端設(shè)計(jì)了文件上傳、題庫(kù)和考試管理、統(tǒng)計(jì)分析等功能,完成了基于微信平臺(tái)的在線學(xué)習(xí)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[6]。
賈歐等通過(guò)使用緩存技術(shù),對(duì)用戶需要查閱的數(shù)據(jù)進(jìn)行預(yù)讀取,提前在數(shù)據(jù)庫(kù)中查詢出符合條件的數(shù)據(jù)存入緩存中,減少數(shù)據(jù)庫(kù)的訪問(wèn)次數(shù),優(yōu)化了電能質(zhì)量智能信息系統(tǒng),提高了Web 應(yīng)用系統(tǒng)的性能[7]。翁美珍等在多媒體會(huì)議系統(tǒng)的研究中,設(shè)計(jì)實(shí)現(xiàn)了基于LRU 替換策略的緩存系統(tǒng),有效提高了緩存系統(tǒng)的字節(jié)命中率,同時(shí)將Memcached 技術(shù)應(yīng)用于Hibernate框架中實(shí)現(xiàn)了數(shù)據(jù)庫(kù)數(shù)據(jù)緩存,提高了訪問(wèn)吞吐量和服務(wù)響應(yīng)速度[8]。
綜上所述,基于Web 服務(wù)端的信息系統(tǒng)在各行各業(yè)中發(fā)揮著舉足輕重的作用,Web 服務(wù)端通過(guò)Token機(jī)制能有效標(biāo)識(shí)用戶身份,通過(guò)緩存技術(shù)能有效提高信息系統(tǒng)的響應(yīng)速度。
本文中的學(xué)生評(píng)教小程序來(lái)自于實(shí)際的教育教學(xué)改革與研究課題,基本的功能要求是每個(gè)學(xué)生正常登錄后可以針對(duì)教師已講授的所有課程做出實(shí)時(shí)的教學(xué)評(píng)價(jià),具體需求有:①身份驗(yàn)證,學(xué)生須用學(xué)號(hào)登錄;②學(xué)生以移動(dòng)端方式(如手機(jī)、平板)評(píng)教為主,以課表為單位進(jìn)行評(píng)教,課表數(shù)據(jù)來(lái)自于教務(wù)系統(tǒng);③數(shù)據(jù)傳輸過(guò)程中應(yīng)采用有效的安全檢測(cè)方法,防止數(shù)據(jù)惡意請(qǐng)求及數(shù)據(jù)泄漏;④Web 服務(wù)端須高效穩(wěn)定運(yùn)行,能實(shí)時(shí)響應(yīng)學(xué)校近數(shù)千名學(xué)生的評(píng)教數(shù)據(jù)請(qǐng)求;⑤評(píng)教界面應(yīng)操作簡(jiǎn)單。
針對(duì)以上需求,本文的Web 服務(wù)端采取如下方式進(jìn)行設(shè)計(jì):
⑴系統(tǒng)結(jié)構(gòu)方面采取經(jīng)典的三層模式架構(gòu)應(yīng)對(duì)評(píng)教業(yè)務(wù)功能,即業(yè)務(wù)邏輯層、數(shù)據(jù)訪問(wèn)層和實(shí)體層。該架構(gòu)最大的優(yōu)勢(shì)是各層之間的結(jié)構(gòu)清晰、易于擴(kuò)展和邏輯復(fù)用,如未來(lái)可在同一系統(tǒng)架構(gòu)下較為方便的增加同行評(píng)教、督導(dǎo)評(píng)教等功能。
⑵采取自定義JSON 序列化方式傳輸數(shù)據(jù)。小程序與Web 服務(wù)端之間的數(shù)據(jù)傳輸須使用標(biāo)準(zhǔn)JSON格式,本文提出了一種自定義JSON 序列化的方式,能實(shí)現(xiàn)定制化輸出,在一定程度上提高了對(duì)象序列化為JSON字符串的效率,提升了系統(tǒng)性能。
⑶采取自定義Token 方式對(duì)用戶身份和數(shù)據(jù)請(qǐng)求進(jìn)行安全驗(yàn)證,防范數(shù)據(jù)惡意請(qǐng)求及數(shù)據(jù)泄漏。
⑷采取數(shù)據(jù)緩存的方式將課表數(shù)據(jù)加載到內(nèi)存中,提高數(shù)據(jù)查找效率,根據(jù)不同數(shù)據(jù)的特點(diǎn)分別采取特定時(shí)間間隔進(jìn)行同步更新,保持?jǐn)?shù)據(jù)一致。
⑸評(píng)教界面以課表為單位,最近七天需要評(píng)教的課表采取列表方式,讓學(xué)生一次選擇后即可打開評(píng)教頁(yè)面進(jìn)行內(nèi)容填寫,其他需評(píng)教的課表采取列表和表格兩種方式進(jìn)行選擇。
Newtonsoft.Json、JavaScriptSerializer 等現(xiàn)有組件提供了較為通用的JSON 序列化方法,使用起來(lái)也比較簡(jiǎn)單,但還不夠靈活,較難實(shí)現(xiàn)定制化輸出,如根據(jù)實(shí)體中的多個(gè)屬性值進(jìn)行邏輯判斷后輸出不同的JSON 字符串、組合多個(gè)實(shí)體的屬性值輸出JSON 字符串等,現(xiàn)有組件面對(duì)此種特殊需求較難實(shí)現(xiàn)。
根據(jù)面向?qū)ο缶幊痰幕舅枷?,哪里出現(xiàn)變化就封裝哪里,即封裝變化點(diǎn),軟件設(shè)計(jì)的關(guān)鍵是能將變化點(diǎn)抽象提煉出來(lái)。通過(guò)對(duì)本文的Web 服務(wù)端功能進(jìn)行分析,學(xué)生、課表等各實(shí)體對(duì)象在進(jìn)行JSON 序列化過(guò)程中可能出現(xiàn)較大變化,因此將該JSON 序列化過(guò)程封裝在特定接口中,具體如下:
其他實(shí)體類須繼承實(shí)現(xiàn)該接口的ToJson 方法來(lái)實(shí)JSON 序列化的定制輸出,如學(xué)生用戶User 類繼承了IJson 接口,并實(shí)現(xiàn)了ToJson 方法,實(shí)現(xiàn)了level 屬性的格式化定制輸出,具體如下:
其他實(shí)體類實(shí)現(xiàn)IJson 接口的過(guò)程與上類似,如圖1所示。
圖1 Web服務(wù)端的實(shí)體類設(shè)計(jì)
Token 的使用在一定程度上提高了數(shù)據(jù)的安全性,在Token 認(rèn)證體系下,小程序通過(guò)用戶身份驗(yàn)證后,接下來(lái)與Web 服務(wù)端的數(shù)據(jù)交互內(nèi)容均由正常的業(yè)務(wù)數(shù)據(jù)+Token 內(nèi)容兩部分組成,其中Token 內(nèi)容用于驗(yàn)證數(shù)據(jù)請(qǐng)求的有效性。標(biāo)準(zhǔn)Token 內(nèi)容包括Header,Payload,Signature,其中Payload存儲(chǔ)著主要的數(shù)據(jù)內(nèi)容,包括用戶Id,TokenId,頒發(fā)時(shí)時(shí)間和過(guò)期時(shí)間等,在實(shí)際業(yè)務(wù)中也可根據(jù)需要包括其他自定義內(nèi)容,此舉固然安全,但標(biāo)準(zhǔn)Token 的內(nèi)容較多,增加了開銷,此外,Token 過(guò)期后,用戶需要重新進(jìn)行用戶名密碼驗(yàn)證,降低了用戶體驗(yàn)。
為了減少小程序與Web 服務(wù)端的數(shù)據(jù)傳輸開銷,本文基于標(biāo)準(zhǔn)Token,自定義了Token 內(nèi)容,使用Guid(128 位,用32 個(gè)十六進(jìn)制數(shù)表示)作為TokenId,小程序與Web 服務(wù)端之間的數(shù)據(jù)傳輸僅加上該TokenId(32 位字符串)用于標(biāo)識(shí)驗(yàn)證用戶,TokenId 的頒發(fā)時(shí)間和有效期驗(yàn)證轉(zhuǎn)移到Web服務(wù)端處理。標(biāo)準(zhǔn)Token和本文自定義Token 兩種情況下的數(shù)據(jù)傳輸對(duì)比如圖2所示。
圖2 標(biāo)準(zhǔn)Token與自定義Token數(shù)據(jù)傳輸對(duì)比
Web 服務(wù)端對(duì)Token 的處理主要由Token 類和TokenBll類完成,具體設(shè)計(jì)如圖3所示。
圖3 Token類和TokenBll類設(shè)計(jì)
Token類的成員以數(shù)據(jù)屬性為主,如表1所示。
表1 Token類
Token類在構(gòu)造函數(shù)中實(shí)現(xiàn)了TokenId的自動(dòng)生成,具體代碼如下:
TokenBll 類包括屬性成員和方法成員兩種,最重要的屬性是Toekens字典集合,其存儲(chǔ)了所有的Token集合,其他屬性和方法均圍繞該字典集合展開相應(yīng)的增加與更新操作,主要說(shuō)明如表2所示。
表2 TokenBll類
私有方法TokenAdd 和TokenUpdate 在實(shí)際使用過(guò)程中需同時(shí)處理多個(gè)客戶端的并發(fā)請(qǐng)求,即需實(shí)現(xiàn)多線程環(huán)境下對(duì)共享數(shù)據(jù)Tokens 字典集合的同步與互斥操作,本文結(jié)合Lock 鎖和LockObj 對(duì)象,實(shí)現(xiàn)了對(duì)該共享資源的控制,具體實(shí)現(xiàn)過(guò)程如下:
傳統(tǒng)模式下,小程序的數(shù)據(jù)交互由小程序端向Web 服務(wù)端發(fā)出數(shù)據(jù)請(qǐng)求,Web 服務(wù)端向數(shù)據(jù)庫(kù)提交SQL命令取得返回結(jié)果,再向小程序端發(fā)出數(shù)據(jù)響應(yīng),該模式經(jīng)過(guò)Web 服務(wù)端與數(shù)據(jù)庫(kù)兩次數(shù)據(jù)響應(yīng),當(dāng)用戶并發(fā)數(shù)較多時(shí),對(duì)整個(gè)程序的性能會(huì)有一定影響。
本文采用了數(shù)據(jù)緩存模式下的數(shù)據(jù)交互方式,Web 服務(wù)端將數(shù)據(jù)庫(kù)中的數(shù)據(jù)提前讀取到數(shù)據(jù)緩存中,當(dāng)收到小程序端的數(shù)據(jù)請(qǐng)求時(shí),從數(shù)據(jù)緩存中查詢數(shù)據(jù)進(jìn)行數(shù)據(jù)響應(yīng),因內(nèi)存查詢的速度遠(yuǎn)高于數(shù)據(jù)庫(kù)的查詢速度,從而提高了數(shù)據(jù)響應(yīng)能力。傳統(tǒng)模式和數(shù)據(jù)緩存模式下的數(shù)據(jù)交互對(duì)比如圖4所示。
圖4 傳統(tǒng)模式與數(shù)據(jù)緩存模式下的數(shù)據(jù)交互對(duì)比
數(shù)據(jù)緩存的關(guān)鍵在于選擇哪些數(shù)據(jù)進(jìn)行緩存,緩存的數(shù)據(jù)何時(shí)更新同步。緩存的數(shù)據(jù)應(yīng)該較少變化,或者是呈現(xiàn)有規(guī)律的變化,如果數(shù)據(jù)經(jīng)常變化,數(shù)據(jù)同步的代價(jià)太高,那就失去了緩存的意義。通過(guò)對(duì)學(xué)生評(píng)教小程序的業(yè)務(wù)進(jìn)行分析,需要交互的評(píng)教數(shù)據(jù)及其特點(diǎn)如下:
⑴學(xué)生登錄數(shù)據(jù),包括學(xué)號(hào)、密碼等,因?yàn)橛脩魰?huì)隨時(shí)修改密碼,所以一般不做緩存處理。
⑵ 課表數(shù)據(jù),包括學(xué)號(hào)、課程名、教師、上課的教室、上課的時(shí)間等。課表數(shù)據(jù)屬于數(shù)據(jù)交互最集中的數(shù)據(jù),學(xué)期課表正式公布后,一般不會(huì)調(diào)整,如果需要調(diào)整,也要提前一到二天,屬于有周期變化規(guī)律的數(shù)據(jù),可做緩存,每天定時(shí)進(jìn)行數(shù)據(jù)同步。
⑶教師列表總數(shù)據(jù),可能會(huì)單獨(dú)請(qǐng)求該數(shù)據(jù),教師列表總數(shù)據(jù)在學(xué)期中途較少有變化,可做緩存,可從最新的課表數(shù)據(jù)中同步更新。
⑷教室列表總數(shù)據(jù),可能會(huì)單獨(dú)請(qǐng)求該數(shù)據(jù),教室列表數(shù)據(jù)是本系統(tǒng)中最少變化的數(shù)據(jù),可做緩存,可從最新的課表數(shù)據(jù)中同步更新。
以上評(píng)教數(shù)據(jù)中,數(shù)據(jù)交互最頻繁的是課表數(shù)據(jù),下面以課表數(shù)據(jù)為例簡(jiǎn)述其數(shù)據(jù)緩存和數(shù)據(jù)同步的實(shí)現(xiàn)過(guò)程,關(guān)鍵代碼如下:
本文基于實(shí)際的高校學(xué)生評(píng)教小程序項(xiàng)目,研究了小程序Web 服務(wù)端的實(shí)現(xiàn)要點(diǎn),通過(guò)自定義JSON序列化,實(shí)現(xiàn)了小程序端與Web 服務(wù)端的數(shù)據(jù)傳輸,通過(guò)自定義Token 完成了數(shù)據(jù)請(qǐng)求的安全驗(yàn)證,通過(guò)數(shù)據(jù)緩存提高了Web 服務(wù)端的響應(yīng)能力,在實(shí)際應(yīng)用中有效提高了小程序Web 服務(wù)端的處理能力,具有一定的參考價(jià)值。