一般情況下,uniGUI項目總要有個登錄窗口,客戶端登錄時,顯示這個窗口。現在我想把這個應用嵌套到app中,由於app已經被用戶登錄,在這種情況下,如果再彈出登錄窗口,要用戶輸入信息,是不合理的。那我該怎么辦呢?
在朋友們的幫助下,實現了用戶免登錄,實現思路,就是在訪問uniGUI的url中加入登錄信息,然后在uniGUI應用中取得登錄信息,完成登錄動作。具體實現方法:
1.在訪問uniGUI的url中加入用戶免與密碼參數:
http://192.168.8.8:8077/m?userid=2222&pw=3333
2.然后,接管uniMainDataModule.OnBeforeLogin事件:
var userid, pw: string; begin //如果url中傳來userid則自動登錄,適應在app中調用,不彈出登錄窗口. if uniGUIApplication.UniApplication.Parameters.IndexOfName('userid') <> -1 then begin userid := uniGUIApplication.UniApplication.Parameters.Values['userid']; pw := uniGUIApplication.UniApplication.Parameters.Values['pw']; CurrentUser.ValidateUser(userid, pw); if UniMainModule.CurrentUser.LoginStatus = TLoginStatus.lsLogined then begin UniMainModule.CurrentUser.Login('Web'); Handled := True; //不彈出登錄窗口 end end; end;
看上面的代碼,首先從訪問的url中取得登錄參數 userid,及pw,注意,這里要加uniGUIApplication單元名稱,不加的話,uniMainDatamodule也有個屬性叫UniApplication,會與uniGUIApplication.UniApplication沖突,這不是一個對象,我在這里犯了點卡。
接着就是實現登錄邏輯,如果用戶驗證成功,將事件參數Handled設置為True,表示完成登錄,不再需要彈出登錄窗口。
現在用帶用戶登錄信息的url訪問uniGUI應用,就直接顯示主窗口,完成自動登錄。
另外,舉一反三,利用這個OnBeforeLogin事件,還可以解決F5刷新瀏覽器時的自動登錄,用戶登錄后將用戶名與密碼保存到Cookie中,然后象上面的代碼一樣,讀出來實現登錄。具體的代碼就不寫了。
3.在自己的app中,根據當前用戶信息,生成帶用戶名與密碼的url,用瀏覽器訪問uniGUI,完美集成。這里就不提供參考代碼。
最后要說的是,在普通的uniGUI的web應用中,填加手機端的Login與MainForm,uniGUI會自動識別訪問的平台,如果是手機訪問,則自動顯示手機端的登錄窗口與主窗口,這很好的支持了一個uniGUI應用自動支持web訪問與手機訪問。
為了方便調試,我們可以在Chrome瀏覽器中模擬手機訪問,具體操作:按crtl+shift+i,切換到開發者模式,然后點擊標記的按鈕,就變成手機了: