Comsenz(康盛)的UCenter當前在國內(nèi)的單點登錄領域占據(jù)絕對份額,其完整的產(chǎn)品線令UCenter成為了賬號集成方面事實上的標準,。 基于UCenter,,可以將Comsenz旗下的Discuz!(社區(qū)論壇系統(tǒng))、SupeSite(門戶CMS系統(tǒng)),、X-Space(博客系統(tǒng))從用戶資源層面進行無縫整合,,使得賬號實現(xiàn)統(tǒng)一管理,在任何一個系統(tǒng)中進行注冊、登錄,、注銷等操作時,,該賬號在其他系統(tǒng)中的會話狀態(tài)也將同步更新,最終實現(xiàn)一號通的單點登錄模式,。 UCenter具備良好的擴展性,,除了完美兼容自家的各種系統(tǒng)外,還支持其他項目的集成,。 我現(xiàn)在準備做的,就是要在一個JAVA項目中,,將會員賬號部分與UCenter保持同步,,以便將來可以順利的嵌入Discuz!社區(qū)論壇系統(tǒng)。 幸好,,已經(jīng)有人為我們寫好了一個面向JAVA的UCenter接口方案,,其項目地址為:http://code.google.com/p/discuz-ucenter-api-for-java 我本次也是基于這個名叫discuz-ucenter-api-for-java的API來實現(xiàn),感謝作者ping.china
一,、準備工作 1,、下載UCenter:http://www./downloads/install/ucenter 2、將UCenter部署到支持PHP腳本的服務器上,,然后按照向?qū)нM行安裝即可,。 3、訪問UCenter控制臺,,添加新應用,,其中: 安裝方式:自定義 應用類型:其他 應用名稱:JAVA項目名稱,可隨意 應用主URL:JAVA項目的訪問地址,,例如:http://localhost:8080/javaTest 通信密鑰:任意字符,,例如:123456 應用接口文件名稱:uc.php,這個不要改,,前面也不要加/api/,,UCenter在與其通信時會自動轉(zhuǎn)換為:http://localhost:8080/javaTest/api/uc.php 是否開啟同步登錄:是 是否接受通知:是 以上的配置項必填,其他保持為空即可,。 點擊“提交”,,保存成功后,記下該JAVA應用的APPID,,下面的配置中會需要,。 此時返回應用列表,UCenter會自動進行通信驗證,,不出意外肯定會出現(xiàn)“通信失敗”的字樣,,先不必管它 二、JAVA項目配置 1、從“discuz-ucenter-api-for-java”的開源項目網(wǎng)站中下載相關的API文件,,也可以從這里下載:JAVA_UCenter.zip 2,、將JAVA_UCenter.zip解壓、覆蓋到你的JAVA項目中,,其中的新文件有: src/config.properties:本地的JAVA項目與UCenter的接口配置文件(需要根據(jù)實際環(huán)境進行配置) src/api/ucenter/Base64.java src/api/ucenter/Client.java:將常用的UCenter操作封裝成的客戶端對象,,我們在項目中主要用它來與UCenter打交道 src/api/ucenter/PHPFunctions.java src/api/ucenter/UC.java:本地的JAVA項目用來接收UCenter同步命令的Servlet接口,其訪問地址必須為:/api/uc.php src/api/ucenter/XMLHelper.java WebRoot/WEB-INF/web.xml:主要就是將src/api/ucenter/UC.java定義為Servlet
注意: (1) src/config.properties中的代碼如下: # ================================================ 除這三項外,其他的配置保持為空即可,。 (2) WebRoot/WEB-INF/web.xml中的代碼如下: <?xml version="1.0" encoding="UTF-8"?> 別的無所謂,,只需注意這一行:<url-pattern>/api/uc.php</url-pattern> 3、JAVA端配置完成,,在eclipse中啟動調(diào)試模式 4,、再次返回到UCenter的控制臺,點擊應用管理,,此時應該會看到綠色的“通信成功”字樣 三,、在JAVA項目中如何具體與UCenter進行通信 做到這里,JAVA項目與UCenter的基本集成工作已經(jīng)圓滿完成,。 至于在JAVA中如何使用Client對象與UCenter進行同步通信,,就很簡單了, 具體可以到discuz-ucenter-api-for-java的開源項目中查看 四,、讓JAVA項目與Discuz!進行會話狀態(tài)同步 1,、在JAVA項目中登錄、退出,,同步到Discuz! 在JAVA項目中,,用戶登錄成功之后,需要執(zhí)行以下代碼: Client uc = new Client(); 其中的$ucsynlogin其實是一段JavaScript代碼,,這段代碼是從UCenter返回的 目的就是向已經(jīng)在UCenter中注冊的應用發(fā)送狀態(tài)同步請求,,保持會話狀態(tài)一致性 所以,就要保證$ucsynlogin中的JS代碼必須輸出到瀏覽器,,并且成功執(zhí)行 2,、在Discuz!中登錄、退出,,同步到JAVA項目 首先,,要注意一個配置選項,,位于Discuz!管理控制臺的:站長 - UCenter設置中 UCenter 連接方式:必須選擇“接口方式”,如果選擇“數(shù)據(jù)庫方式”,,則不會向其他應用發(fā)送同步請求 然后,,在我們JAVA項目中,作為與UCenter對話的窗口,,src/api/ucenter/UC.java就會負責接收其他應用通過UCenter發(fā)送過來的會話狀態(tài)同步請求 其中的$action.equals("synlogin")為登錄同步,,修改其中對Cookie的賦值代碼,實現(xiàn)本地系統(tǒng)的會話也保持登錄狀態(tài) 其中的$action.equals("synlogout")為登出同步,,同樣,,修改代碼,實現(xiàn)本地的登出同步,。 注意其中的一行代碼: response.addHeader("P3P","CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\""); 意思是要求瀏覽器對當前的Cookie操作寬容對待,,如果涉及跨域操作也不要阻止。所以,,這行代碼原樣保留,可以使狀態(tài)同步更加穩(wěn)定,。 五,、已知問題 貌似使用中文注冊的賬號,在同步時可能會因為Base64解碼不一致的原因發(fā)生問題,,具體我還沒有測試,,等到發(fā)生時再詳細記載。
|
|