楊世旺 劉波
(廣西廣播電視技術(shù)中心)
JEECMSv9.3平臺是江西金磊科技發(fā)展有限公司旗下的產(chǎn)品,它是一款集PC互聯(lián)網(wǎng)、移動互聯(lián)網(wǎng)和微信網(wǎng)站于一體的網(wǎng)站群管理系統(tǒng),新門戶網(wǎng)站基于此平臺進(jìn)行開發(fā)。
單位內(nèi)部業(yè)務(wù)系統(tǒng)眾多,門戶網(wǎng)站作為單位對外開放展示的窗口,將各個業(yè)務(wù)系統(tǒng)入口整合到門戶網(wǎng)站中非常有必要,可解決了各業(yè)務(wù)系統(tǒng)重復(fù)登錄的問題。在進(jìn)行業(yè)務(wù)系統(tǒng)單點(diǎn)登錄整合過程中,發(fā)現(xiàn)即使JEECMSv9.3框架提供了統(tǒng)一的單點(diǎn)登錄接口,但由于單位各業(yè)務(wù)系統(tǒng)均已不在維護(hù)期,且系統(tǒng)接口不統(tǒng)一或未提供單點(diǎn)登錄驗(yàn)證接口,所以只能通過技術(shù)手段對平臺代碼進(jìn)行二次開發(fā),實(shí)現(xiàn)各業(yè)務(wù)系統(tǒng)單點(diǎn)登錄整合功能。
由于整合過程是單向整合,各業(yè)務(wù)系統(tǒng)無法針對單點(diǎn)登錄進(jìn)行接口調(diào)整,所以產(chǎn)生不少技術(shù)問題。
通過分析JEECMSv9.3平臺代碼得知,該平臺核心框架為FreeMarker+hibernate+Spirng的mvc分層架構(gòu),平臺后臺采用了Maven開發(fā)技術(shù),網(wǎng)站管理后臺采用VUE技術(shù),網(wǎng)站前臺采用html腳本結(jié)合jquery等技術(shù)實(shí)現(xiàn)。門戶網(wǎng)站要實(shí)現(xiàn)單點(diǎn)登錄功能,需改動網(wǎng)站前臺代碼和平臺后臺代碼。由于平臺的高度可配置性,網(wǎng)站前臺代碼和后臺代碼的交互非常靈活,前臺的所有鏈接都需要和后臺進(jìn)行交互,因此對網(wǎng)站代碼的熟悉程度對于單點(diǎn)登錄功能的開發(fā)非常關(guān)鍵。
系統(tǒng)后臺采用eclipse集成管理工具作為java代碼編譯環(huán)境,前臺網(wǎng)站代碼由于都是通過平臺動態(tài)生成的,不適合采用任何開發(fā)工具去編譯開發(fā),所以只能采用文本編輯的方式去調(diào)整。此外,網(wǎng)站前臺采用html靜態(tài)腳本進(jìn)行展示,而網(wǎng)站后臺采用java進(jìn)行相應(yīng)基本邏輯處理,因此選擇通過jquery技術(shù)實(shí)現(xiàn)前后臺的同步、異步交互,來協(xié)助實(shí)現(xiàn)單點(diǎn)登錄功能的集成。
集成單點(diǎn)登錄的目的是實(shí)現(xiàn)各業(yè)務(wù)系統(tǒng)的免登錄進(jìn)入,其基本設(shè)計邏輯為:
點(diǎn)擊單點(diǎn)登錄入口,先檢測門戶網(wǎng)站是否已登錄,如未登錄,則進(jìn)行提示并跳轉(zhuǎn)到門戶登錄頁面;
如果門戶網(wǎng)站已登錄,下一步則是判斷該業(yè)務(wù)系統(tǒng)是否已進(jìn)行綁定,如未綁定,則自動跳轉(zhuǎn)到綁定頁面;
如果業(yè)務(wù)系統(tǒng)已綁定,則在記錄此次登錄的相關(guān)信息后,直接跳轉(zhuǎn)進(jìn)入業(yè)務(wù)系統(tǒng)。
基本設(shè)計邏輯流程展示如圖1。
圖1 基本設(shè)計流程
記錄業(yè)務(wù)系統(tǒng)的綁定、登錄等信息時需要和數(shù)據(jù)庫進(jìn)行交互,保存業(yè)務(wù)系統(tǒng)的名稱、用戶名、密碼、綁定時間、登錄時間、登錄次數(shù)等,詳細(xì)的數(shù)據(jù)表設(shè)計如表1。
表1 表結(jié)構(gòu)設(shè)計
1.跳轉(zhuǎn)判斷
當(dāng)用戶點(diǎn)擊業(yè)務(wù)系統(tǒng)入口時,系統(tǒng)需要將該業(yè)務(wù)系統(tǒng)的服務(wù)器網(wǎng)址、端口、驗(yàn)證方法等參數(shù)傳遞到后臺進(jìn)行驗(yàn)證,為了方便這些參數(shù)讀取,將參數(shù)以json對象的形式,保存在js配置文件中。
門戶網(wǎng)站業(yè)務(wù)系統(tǒng)入口使用html技術(shù)中的標(biāo)簽進(jìn)行展示,首先將標(biāo)簽中的href屬性設(shè)置成(#)空錨點(diǎn),使其在單擊時不做跳轉(zhuǎn)刷新,而在標(biāo)簽單擊(onclick)方法功能中,添加綁定js中自定義的ITool.sso函數(shù),如:
在綁定的ITool.sso方法中,通過使用jquery的ajax技術(shù),實(shí)現(xiàn)與java后臺進(jìn)行交互,獲取門戶網(wǎng)站登錄、業(yè)務(wù)系統(tǒng)綁定信息,并在交互成功后,通過邏輯判斷,設(shè)定跳轉(zhuǎn)鏈接,跳轉(zhuǎn)到登錄頁面、綁定頁面或直接單點(diǎn)登錄進(jìn)入業(yè)務(wù)系統(tǒng),實(shí)現(xiàn)邏輯如圖2。
2.綁定操作
圖2 頁面跳轉(zhuǎn)判斷
當(dāng)判斷業(yè)務(wù)系統(tǒng)未進(jìn)行綁定時,系統(tǒng)自動跳轉(zhuǎn)到綁定頁面,系統(tǒng)綁定頁面借鑒了網(wǎng)站登錄頁面,需要用戶輸入綁定系統(tǒng)的用戶名和密碼,然后點(diǎn)擊綁定按鈕,系統(tǒng)將通過ajax方法和后臺交互,并進(jìn)行第三方跨域提交驗(yàn)證。在和第三方系統(tǒng)進(jìn)行跨域登錄認(rèn)證時,經(jīng)過多次嘗試,由于第三方業(yè)務(wù)系統(tǒng)不一定支持ajax異步認(rèn)證的方式,所以該認(rèn)證統(tǒng)一采用后臺認(rèn)證的方式。
由于不同的業(yè)務(wù)系統(tǒng)的跨域認(rèn)證會返回不同的認(rèn)證結(jié)果,在系統(tǒng)認(rèn)證設(shè)計時,通過動態(tài)js方法,實(shí)現(xiàn)不同的業(yè)務(wù)系統(tǒng)的認(rèn)證跳轉(zhuǎn)。
在進(jìn)行第三方跨域認(rèn)證時,使用后臺java的URLConnection類,讀取請求URL,并返回請求結(jié)果的頁面內(nèi)容信息,通過對頁面內(nèi)容進(jìn)行解析,判斷認(rèn)證是否成功,如圖3。
圖3 第三方跨域登錄認(rèn)證
判定是否綁定成功,如綁定成功,則直接跳轉(zhuǎn)單點(diǎn)登錄進(jìn)入業(yè)務(wù)系統(tǒng),如失敗,則在頁面上已紅色字體提示錯誤信息。
3.登錄跳轉(zhuǎn)
在綁定成功或者判定用戶已綁定業(yè)務(wù)系統(tǒng)后,需要使用前臺jquery技術(shù),動態(tài)創(chuàng)建所需提交的元素標(biāo)簽,模擬業(yè)務(wù)系統(tǒng)的form表單提交方法,實(shí)現(xiàn)邏輯如圖4。
4.綁定管理
在用戶對業(yè)務(wù)系統(tǒng)進(jìn)行綁定后,可能會存在所綁定的業(yè)務(wù)系統(tǒng)用戶名或者密碼已修改的情況,針對這種情況,前臺增加了綁定管理功能,實(shí)現(xiàn)對業(yè)務(wù)系統(tǒng)的解除綁定、重新綁定等功能。
1.代碼邏輯
通過分析平臺后臺代碼,將單點(diǎn)登錄后臺java代碼的實(shí)現(xiàn)附加在平臺用戶管理模塊;后臺代碼主要需要實(shí)現(xiàn)用戶網(wǎng)站登錄狀態(tài)、綁定狀態(tài)獲取,頁面跳轉(zhuǎn)參數(shù)獲取及調(diào)整等。
圖4 登錄跳轉(zhuǎn)
用戶網(wǎng)站登錄狀態(tài)、綁定狀態(tài)獲取,首先獲取網(wǎng)站登錄用戶信息,如獲取不到,則返回用戶登錄狀態(tài)為false,如能獲取,則根據(jù)用戶ID和參數(shù)到數(shù)據(jù)庫讀取綁定信息,如已綁定,則進(jìn)一步返回綁定的用戶名和密碼等相關(guān)信息。
在進(jìn)行第三方跨域用戶綁定認(rèn)證時,采用后臺java的URLConnection類,實(shí)現(xiàn)方法中,除了傳遞請求的httpUrl外,還需傳遞進(jìn)來編碼方式和超時時間,否則會造成返回結(jié)果亂碼或在網(wǎng)絡(luò)不通暢時網(wǎng)頁卡頓的現(xiàn)象。
此外,為了保證代碼的嚴(yán)謹(jǐn)性、可讀性,在進(jìn)行后臺java編碼時,需嚴(yán)格遵守平臺的后臺編碼規(guī)范,這對系統(tǒng)的后續(xù)升級維護(hù)至關(guān)重要。
2.數(shù)據(jù)庫操作
單點(diǎn)登錄的綁定信息,最終都會保存到數(shù)據(jù)庫表sso_user中,實(shí)現(xiàn)邏輯設(shè)計如下:
當(dāng)?shù)谝淮谓壎〞r,判斷是否已綁定過,如已綁定,則修改綁定狀態(tài),如未綁定,則記錄綁定系統(tǒng)編號、用戶ID、綁定用戶名稱、加密后的綁定用戶密碼,綁定時間等;
用戶進(jìn)行單點(diǎn)登錄時,記錄用戶的登錄次數(shù),登錄時間等;
進(jìn)行解除綁定時,修改該綁定的狀態(tài)、最后修改時間。
第一、在進(jìn)行單點(diǎn)登錄第三方跨域認(rèn)證時,經(jīng)過多次嘗試,最終選定使用后臺java的URLConnection類來實(shí)現(xiàn),因?yàn)榈谌綐I(yè)務(wù)系統(tǒng)不一定支持ajax異步認(rèn)證的方式,所以驗(yàn)證時是直接調(diào)用業(yè)務(wù)系統(tǒng)的登錄方法來實(shí)現(xiàn),所以無法使用前臺ajax請求來獲取認(rèn)證請求結(jié)果;
第二、在進(jìn)行第三方系統(tǒng)登錄跳轉(zhuǎn)時,模擬form表單進(jìn)行提交時,需要注意提交頁面的編碼方式,做到動態(tài)修改成第三方網(wǎng)站所需的編碼方式,在提交后,再將網(wǎng)站編碼方式修改回來,否則會造成原網(wǎng)站亂碼或功能異常;
第三、當(dāng)遇到實(shí)在無法單向去對第三方系統(tǒng)進(jìn)行判斷驗(yàn)證或者登錄時,最好的方式還是通過和相關(guān)技術(shù)人員進(jìn)行溝通,獲取第三方系統(tǒng)的相關(guān)信息,如在和對接集成時,是否要對參數(shù)進(jìn)行加密操作等,這集成前是無法預(yù)知的,所以及時的溝通非常重要。
目前單位的門戶網(wǎng)站OA辦公、監(jiān)控平臺兩個單點(diǎn)登錄接口已經(jīng)完成編碼和測試工作,程序已可正常運(yùn)行;如后續(xù)需要增加其他第三方接口時,可以有所借鑒或者直接復(fù)用已有的接口,減少不必要的重復(fù)工作,提高工作效率。