楊世旺 劉波
(廣西廣播電視技術(shù)中心)
JEECMSv9.3平臺(tái)是江西金磊科技發(fā)展有限公司旗下的產(chǎn)品,它是一款集PC互聯(lián)網(wǎng)、移動(dòng)互聯(lián)網(wǎng)和微信網(wǎng)站于一體的網(wǎng)站群管理系統(tǒng),新門(mén)戶(hù)網(wǎng)站基于此平臺(tái)進(jìn)行開(kāi)發(fā)。
單位內(nèi)部業(yè)務(wù)系統(tǒng)眾多,門(mén)戶(hù)網(wǎng)站作為單位對(duì)外開(kāi)放展示的窗口,將各個(gè)業(yè)務(wù)系統(tǒng)入口整合到門(mén)戶(hù)網(wǎng)站中非常有必要,可解決了各業(yè)務(wù)系統(tǒng)重復(fù)登錄的問(wèn)題。在進(jìn)行業(yè)務(wù)系統(tǒng)單點(diǎn)登錄整合過(guò)程中,發(fā)現(xiàn)即使JEECMSv9.3框架提供了統(tǒng)一的單點(diǎn)登錄接口,但由于單位各業(yè)務(wù)系統(tǒng)均已不在維護(hù)期,且系統(tǒng)接口不統(tǒng)一或未提供單點(diǎn)登錄驗(yàn)證接口,所以只能通過(guò)技術(shù)手段對(duì)平臺(tái)代碼進(jìn)行二次開(kāi)發(fā),實(shí)現(xiàn)各業(yè)務(wù)系統(tǒng)單點(diǎn)登錄整合功能。
由于整合過(guò)程是單向整合,各業(yè)務(wù)系統(tǒng)無(wú)法針對(duì)單點(diǎn)登錄進(jìn)行接口調(diào)整,所以產(chǎn)生不少技術(shù)問(wèn)題。
通過(guò)分析JEECMSv9.3平臺(tái)代碼得知,該平臺(tái)核心框架為FreeMarker+hibernate+Spirng的mvc分層架構(gòu),平臺(tái)后臺(tái)采用了Maven開(kāi)發(fā)技術(shù),網(wǎng)站管理后臺(tái)采用VUE技術(shù),網(wǎng)站前臺(tái)采用html腳本結(jié)合jquery等技術(shù)實(shí)現(xiàn)。門(mén)戶(hù)網(wǎng)站要實(shí)現(xiàn)單點(diǎn)登錄功能,需改動(dòng)網(wǎng)站前臺(tái)代碼和平臺(tái)后臺(tái)代碼。由于平臺(tái)的高度可配置性,網(wǎng)站前臺(tái)代碼和后臺(tái)代碼的交互非常靈活,前臺(tái)的所有鏈接都需要和后臺(tái)進(jìn)行交互,因此對(duì)網(wǎng)站代碼的熟悉程度對(duì)于單點(diǎn)登錄功能的開(kāi)發(fā)非常關(guān)鍵。
系統(tǒng)后臺(tái)采用eclipse集成管理工具作為java代碼編譯環(huán)境,前臺(tái)網(wǎng)站代碼由于都是通過(guò)平臺(tái)動(dòng)態(tài)生成的,不適合采用任何開(kāi)發(fā)工具去編譯開(kāi)發(fā),所以只能采用文本編輯的方式去調(diào)整。此外,網(wǎng)站前臺(tái)采用html靜態(tài)腳本進(jìn)行展示,而網(wǎng)站后臺(tái)采用java進(jìn)行相應(yīng)基本邏輯處理,因此選擇通過(guò)jquery技術(shù)實(shí)現(xiàn)前后臺(tái)的同步、異步交互,來(lái)協(xié)助實(shí)現(xiàn)單點(diǎn)登錄功能的集成。
集成單點(diǎn)登錄的目的是實(shí)現(xiàn)各業(yè)務(wù)系統(tǒng)的免登錄進(jìn)入,其基本設(shè)計(jì)邏輯為:
點(diǎn)擊單點(diǎn)登錄入口,先檢測(cè)門(mén)戶(hù)網(wǎng)站是否已登錄,如未登錄,則進(jìn)行提示并跳轉(zhuǎn)到門(mén)戶(hù)登錄頁(yè)面;
如果門(mén)戶(hù)網(wǎng)站已登錄,下一步則是判斷該業(yè)務(wù)系統(tǒng)是否已進(jìn)行綁定,如未綁定,則自動(dòng)跳轉(zhuǎn)到綁定頁(yè)面;
如果業(yè)務(wù)系統(tǒng)已綁定,則在記錄此次登錄的相關(guān)信息后,直接跳轉(zhuǎn)進(jìn)入業(yè)務(wù)系統(tǒng)。
基本設(shè)計(jì)邏輯流程展示如圖1。

圖1 基本設(shè)計(jì)流程
記錄業(yè)務(wù)系統(tǒng)的綁定、登錄等信息時(shí)需要和數(shù)據(jù)庫(kù)進(jìn)行交互,保存業(yè)務(wù)系統(tǒng)的名稱(chēng)、用戶(hù)名、密碼、綁定時(shí)間、登錄時(shí)間、登錄次數(shù)等,詳細(xì)的數(shù)據(jù)表設(shè)計(jì)如表1。

表1 表結(jié)構(gòu)設(shè)計(jì)
1.跳轉(zhuǎn)判斷
當(dāng)用戶(hù)點(diǎn)擊業(yè)務(wù)系統(tǒng)入口時(shí),系統(tǒng)需要將該業(yè)務(wù)系統(tǒng)的服務(wù)器網(wǎng)址、端口、驗(yàn)證方法等參數(shù)傳遞到后臺(tái)進(jìn)行驗(yàn)證,為了方便這些參數(shù)讀取,將參數(shù)以json對(duì)象的形式,保存在js配置文件中。
門(mén)戶(hù)網(wǎng)站業(yè)務(wù)系統(tǒng)入口使用html技術(shù)中的標(biāo)簽進(jìn)行展示,首先將標(biāo)簽中的href屬性設(shè)置成(#)空錨點(diǎn),使其在單擊時(shí)不做跳轉(zhuǎn)刷新,而在標(biāo)簽單擊(onclick)方法功能中,添加綁定js中自定義的ITool.sso函數(shù),如:
在綁定的ITool.sso方法中,通過(guò)使用jquery的ajax技術(shù),實(shí)現(xiàn)與java后臺(tái)進(jìn)行交互,獲取門(mén)戶(hù)網(wǎng)站登錄、業(yè)務(wù)系統(tǒng)綁定信息,并在交互成功后,通過(guò)邏輯判斷,設(shè)定跳轉(zhuǎn)鏈接,跳轉(zhuǎn)到登錄頁(yè)面、綁定頁(yè)面或直接單點(diǎn)登錄進(jìn)入業(yè)務(wù)系統(tǒng),實(shí)現(xiàn)邏輯如圖2。
2.綁定操作

圖2 頁(yè)面跳轉(zhuǎn)判斷
當(dāng)判斷業(yè)務(wù)系統(tǒng)未進(jìn)行綁定時(shí),系統(tǒng)自動(dòng)跳轉(zhuǎn)到綁定頁(yè)面,系統(tǒng)綁定頁(yè)面借鑒了網(wǎng)站登錄頁(yè)面,需要用戶(hù)輸入綁定系統(tǒng)的用戶(hù)名和密碼,然后點(diǎn)擊綁定按鈕,系統(tǒng)將通過(guò)ajax方法和后臺(tái)交互,并進(jìn)行第三方跨域提交驗(yàn)證。在和第三方系統(tǒng)進(jìn)行跨域登錄認(rèn)證時(shí),經(jīng)過(guò)多次嘗試,由于第三方業(yè)務(wù)系統(tǒng)不一定支持ajax異步認(rèn)證的方式,所以該認(rèn)證統(tǒng)一采用后臺(tái)認(rèn)證的方式。
由于不同的業(yè)務(wù)系統(tǒng)的跨域認(rèn)證會(huì)返回不同的認(rèn)證結(jié)果,在系統(tǒng)認(rèn)證設(shè)計(jì)時(shí),通過(guò)動(dòng)態(tài)js方法,實(shí)現(xiàn)不同的業(yè)務(wù)系統(tǒng)的認(rèn)證跳轉(zhuǎn)。
在進(jìn)行第三方跨域認(rèn)證時(shí),使用后臺(tái)java的URLConnection類(lèi),讀取請(qǐng)求URL,并返回請(qǐng)求結(jié)果的頁(yè)面內(nèi)容信息,通過(guò)對(duì)頁(yè)面內(nèi)容進(jìn)行解析,判斷認(rèn)證是否成功,如圖3。

圖3 第三方跨域登錄認(rèn)證
判定是否綁定成功,如綁定成功,則直接跳轉(zhuǎn)單點(diǎn)登錄進(jìn)入業(yè)務(wù)系統(tǒng),如失敗,則在頁(yè)面上已紅色字體提示錯(cuò)誤信息。
3.登錄跳轉(zhuǎn)
在綁定成功或者判定用戶(hù)已綁定業(yè)務(wù)系統(tǒng)后,需要使用前臺(tái)jquery技術(shù),動(dòng)態(tài)創(chuàng)建所需提交的元素標(biāo)簽,模擬業(yè)務(wù)系統(tǒng)的form表單提交方法,實(shí)現(xiàn)邏輯如圖4。
4.綁定管理
在用戶(hù)對(duì)業(yè)務(wù)系統(tǒng)進(jìn)行綁定后,可能會(huì)存在所綁定的業(yè)務(wù)系統(tǒng)用戶(hù)名或者密碼已修改的情況,針對(duì)這種情況,前臺(tái)增加了綁定管理功能,實(shí)現(xiàn)對(duì)業(yè)務(wù)系統(tǒng)的解除綁定、重新綁定等功能。
1.代碼邏輯
通過(guò)分析平臺(tái)后臺(tái)代碼,將單點(diǎn)登錄后臺(tái)java代碼的實(shí)現(xiàn)附加在平臺(tái)用戶(hù)管理模塊;后臺(tái)代碼主要需要實(shí)現(xiàn)用戶(hù)網(wǎng)站登錄狀態(tài)、綁定狀態(tài)獲取,頁(yè)面跳轉(zhuǎn)參數(shù)獲取及調(diào)整等。

圖4 登錄跳轉(zhuǎn)
用戶(hù)網(wǎng)站登錄狀態(tài)、綁定狀態(tài)獲取,首先獲取網(wǎng)站登錄用戶(hù)信息,如獲取不到,則返回用戶(hù)登錄狀態(tài)為false,如能獲取,則根據(jù)用戶(hù)ID和參數(shù)到數(shù)據(jù)庫(kù)讀取綁定信息,如已綁定,則進(jìn)一步返回綁定的用戶(hù)名和密碼等相關(guān)信息。
在進(jìn)行第三方跨域用戶(hù)綁定認(rèn)證時(shí),采用后臺(tái)java的URLConnection類(lèi),實(shí)現(xiàn)方法中,除了傳遞請(qǐng)求的httpUrl外,還需傳遞進(jìn)來(lái)編碼方式和超時(shí)時(shí)間,否則會(huì)造成返回結(jié)果亂碼或在網(wǎng)絡(luò)不通暢時(shí)網(wǎng)頁(yè)卡頓的現(xiàn)象。
此外,為了保證代碼的嚴(yán)謹(jǐn)性、可讀性,在進(jìn)行后臺(tái)java編碼時(shí),需嚴(yán)格遵守平臺(tái)的后臺(tái)編碼規(guī)范,這對(duì)系統(tǒng)的后續(xù)升級(jí)維護(hù)至關(guān)重要。
2.數(shù)據(jù)庫(kù)操作
單點(diǎn)登錄的綁定信息,最終都會(huì)保存到數(shù)據(jù)庫(kù)表sso_user中,實(shí)現(xiàn)邏輯設(shè)計(jì)如下:
當(dāng)?shù)谝淮谓壎〞r(shí),判斷是否已綁定過(guò),如已綁定,則修改綁定狀態(tài),如未綁定,則記錄綁定系統(tǒng)編號(hào)、用戶(hù)ID、綁定用戶(hù)名稱(chēng)、加密后的綁定用戶(hù)密碼,綁定時(shí)間等;
用戶(hù)進(jìn)行單點(diǎn)登錄時(shí),記錄用戶(hù)的登錄次數(shù),登錄時(shí)間等;
進(jìn)行解除綁定時(shí),修改該綁定的狀態(tài)、最后修改時(shí)間。
第一、在進(jìn)行單點(diǎn)登錄第三方跨域認(rèn)證時(shí),經(jīng)過(guò)多次嘗試,最終選定使用后臺(tái)java的URLConnection類(lèi)來(lái)實(shí)現(xiàn),因?yàn)榈谌綐I(yè)務(wù)系統(tǒng)不一定支持ajax異步認(rèn)證的方式,所以驗(yàn)證時(shí)是直接調(diào)用業(yè)務(wù)系統(tǒng)的登錄方法來(lái)實(shí)現(xiàn),所以無(wú)法使用前臺(tái)ajax請(qǐng)求來(lái)獲取認(rèn)證請(qǐng)求結(jié)果;
第二、在進(jìn)行第三方系統(tǒng)登錄跳轉(zhuǎn)時(shí),模擬form表單進(jìn)行提交時(shí),需要注意提交頁(yè)面的編碼方式,做到動(dòng)態(tài)修改成第三方網(wǎng)站所需的編碼方式,在提交后,再將網(wǎng)站編碼方式修改回來(lái),否則會(huì)造成原網(wǎng)站亂碼或功能異常;
第三、當(dāng)遇到實(shí)在無(wú)法單向去對(duì)第三方系統(tǒng)進(jìn)行判斷驗(yàn)證或者登錄時(shí),最好的方式還是通過(guò)和相關(guān)技術(shù)人員進(jìn)行溝通,獲取第三方系統(tǒng)的相關(guān)信息,如在和對(duì)接集成時(shí),是否要對(duì)參數(shù)進(jìn)行加密操作等,這集成前是無(wú)法預(yù)知的,所以及時(shí)的溝通非常重要。
目前單位的門(mén)戶(hù)網(wǎng)站OA辦公、監(jiān)控平臺(tái)兩個(gè)單點(diǎn)登錄接口已經(jīng)完成編碼和測(cè)試工作,程序已可正常運(yùn)行;如后續(xù)需要增加其他第三方接口時(shí),可以有所借鑒或者直接復(fù)用已有的接口,減少不必要的重復(fù)工作,提高工作效率。