1. 問(wèn)題描述
對于OA系統中想實(shí)現對FineReport的單點(diǎn)登錄,用戶(hù)需要在OA的登錄界面中將用戶(hù)名和密碼傳入到報表的認證地址進(jìn)行認證,若OA系統和報表系統不是部署在同一臺服務(wù)器上,在進(jìn)行登錄時(shí)進(jìn)行跨域,在上一節介紹了ajax跨域異步單點(diǎn)登陸,那么要如何通過(guò)iframe方式實(shí)現OA系統和報表系統的跨域登錄呢? 2. 實(shí)現思路
在OA系統的登錄界面的js中將報表先把權限驗證地址以iframe的方式嵌入,解決js跨域問(wèn)題,然后再在iframe里面觸發(fā)表單登錄事件,實(shí)現登錄頁(yè)面的跳轉。
3. 示例(數據決策系統op=fs)
以登陸數據決策系統(op=fs)為例,通過(guò)簡(jiǎn)化的OA登錄頁(yè)面說(shuō)明iframe跨域單點(diǎn)登錄的實(shí)現步驟:
數據決策系統(op=fs)身份驗證地址為:
3.1 iframe實(shí)現步驟
用戶(hù)輸入用戶(hù)名密碼后點(diǎn)擊提交或登錄按鈕時(shí),觸發(fā)doSubmit()方法,該方法中先創(chuàng )建一個(gè)iframe,然后將報表驗證用戶(hù)名密碼的認證地址指向此iframe的src,并對使用的瀏覽器進(jìn)行判斷因為每個(gè)瀏覽器注冊寫(xiě)法不太一樣,然后將此iframe標簽加入到head標簽中,實(shí)現報表認證代碼如下:
注:由于編碼的問(wèn)題,要對輸入的用戶(hù)名和密碼進(jìn)行cjkEncode編碼,需要引入finereport.js,在head標簽中引入finereport.js,如下:
也可以自己寫(xiě)cjkEncode函數,實(shí)現方法見(jiàn)編碼轉換文檔。 另:如果登錄頁(yè)面所在工程不是FineReport的工程,則無(wú)法引入finereport.js,自定義cjkEncode函數,示例中沒(méi)有進(jìn)行編碼轉換。
修改后即可以實(shí)現跨域單點(diǎn)登錄的代碼如下:
說(shuō)明:用戶(hù)名密碼表單中使用button來(lái)觸發(fā)doSubmit(),您只要將doSubmit()方法加入到您的OA的登錄頁(yè)面中即可,為了簡(jiǎn)化操作,完整代碼中沒(méi)有跳轉到指定頁(yè)面,直接跳轉到op=fs壓面。
4. 示例(平臺管理op=fr_platform登錄)
將上面的scr.src地址換成平臺管理的報表身份驗證地址即可:
5. 注銷(xiāo)用戶(hù)
5.1 管理平臺的登出
當注銷(xiāo)項目用戶(hù)時(shí),同時(shí)也希望注銷(xiāo)報表用戶(hù)名的session,即退出管理平臺,這時(shí)可在點(diǎn)擊退出按鈕時(shí)調用一下報表登出驗證方法:/WebReport/ReportServer?op=auth_logout就可以實(shí)現FR管理平臺的退出登錄。
5.2 數據決策系統(op=fs)的登出
當將FineReport的決策系統集成到項目中時(shí),注銷(xiāo)項目用戶(hù),同時(shí)也希望注銷(xiāo)決策系統的用戶(hù)名session,即退出決策系統,其登出方法為:/WebReport/ReportServer?op=fs_load&cmd=logout就可以實(shí)現FR決策系統的登出。