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

圖1 基本設計流程
記錄業務系統的綁定、登錄等信息時需要和數據庫進行交互,保存業務系統的名稱、用戶名、密碼、綁定時間、登錄時間、登錄次數等,詳細的數據表設計如表1。

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

圖2 頁面跳轉判斷
當判斷業務系統未進行綁定時,系統自動跳轉到綁定頁面,系統綁定頁面借鑒了網站登錄頁面,需要用戶輸入綁定系統的用戶名和密碼,然后點擊綁定按鈕,系統將通過ajax方法和后臺交互,并進行第三方跨域提交驗證。在和第三方系統進行跨域登錄認證時,經過多次嘗試,由于第三方業務系統不一定支持ajax異步認證的方式,所以該認證統一采用后臺認證的方式。
由于不同的業務系統的跨域認證會返回不同的認證結果,在系統認證設計時,通過動態js方法,實現不同的業務系統的認證跳轉。
在進行第三方跨域認證時,使用后臺java的URLConnection類,讀取請求URL,并返回請求結果的頁面內容信息,通過對頁面內容進行解析,判斷認證是否成功,如圖3。

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

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