国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android端實現單點登錄的方法詳解

2019-12-12 04:47:24
字體:
來源:轉載
供稿:網友

前言

單點登錄SSO(Single Sign On)說得簡單點就是在一個多系統共存的環境下,用戶在一處登錄后,就不用在其他系統中登錄,也就是用戶的一次登錄能得到其他所有系統的信任。單點登錄在大型網站里使用得非常頻繁,例如像阿里巴巴這樣的網站,在網站的背后是成百上千的子系統,用戶一次操作或交易可能涉及到幾十個子系統的協作,如果每個子系統都需要用戶認證,不僅用戶會瘋掉,各子系統也會為這種重復認證授權的邏輯搞瘋掉。實現單點登錄說到底就是要解決如何產生和存儲那個信任,再就是其他系統如何驗證這個信任的有效性,因此要點也就以下兩個:

      存儲信任

      驗證信任

如果一個系統做到了開頭所講的效果,也就算單點登錄,下面就來看看在Android端實現單點登錄的方法。

服務端

服務端需要集成Token,每次在app登錄時為app分配新的token,如果在某次http請求中app傳遞token不是最新的,則視為需要重新登錄(或者根據自己需要后臺設定token有效時間,過期視為Token失效,需要重新登錄).在token失效的情況下,返回約定好的code

Android端監聽

App如何知道已經在其他設備登錄了呢,一般可以有三種方式

1.api請求中后臺返回特定code

這種是最常見的方式,缺點是需要下次api請求才知道被踢下線,可以在網絡層實體模型的基類BaseModel中處理,對code進行判斷

    switch (code) {    case 1:      break;    case 3://被踢下線      //Do Something      break;    }

2.推送

后臺推送給app,從而app得知該賬戶在其他設備登錄了,進而執行下線操作,優點是可以及時響應

3.使用第三方的監聽器

很多時候app會集成一些第三方的賬戶系統,例如在集成了環信的app中,每個用戶對應一個環信的imUserName,環信自身有提供連接狀態的接聽,通過監聽環信的用戶狀態,從而達到監聽app自身用戶系統的效果

    EMClient.getInstance().addConnectionListener(this);

Android被踢下線后的操作

不管是哪種監聽方式,最后的操作都是一樣的,可以根據自己的需求進行對應的操作.這里提供一種常規化的下線流程.

從棧頂取到當前的前臺Activity,Dialog提示用戶,點擊后跳轉登錄頁


首先,任意地方獲取到前臺Activity

public Activity getTaskTop() {  return mActivities.get(mActivities.size() - 1);}

然后在主線程彈出dialog

private void onConnectionConflict() {//被踢下線處理  SPUtils.logout();  final Activity taskTop = ActivityManager.getInstance().getTaskTop();  if (taskTop == null) return;  new Handler(Looper.getMainLooper()).post(new Runnable() {    @Override    public void run() {      MDdialogFactory.CreateMustOkDia(taskTop, "您的賬號已在其他終端登錄,請重新登錄", new MDCallBack() {        @Override        public void onMdCall(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {          Intent intent = new Intent(taskTop, LoginActivity.class);          intent.putExtra(ConstantKey.MUST_LOGIN_KEY, true);          taskTop.startActivity(intent);        }      }).show();    }  });}

這里做一些說明

由于監聽到被踢下線的環境不一定在主線程,所以需要切換到主線程進行彈出Dilaog

 new Handler(Looper.getMainLooper()).post(Runnable r)

這里的dialog是強制的,取消不了(這里dialog是自定義的,用系統的也是可以的,這不是重點)

 builder.cancelable(false); builder.canceledOnTouchOutside(false);

總結

以上就是這篇文章的全部內容了,希望本文的內容對各位Android開發者們能有所幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新晃| 兴安盟| 长岭县| 达州市| 富平县| 武宣县| 唐海县| 德惠市| 奉新县| 牟定县| 思茅市| 全州县| 奈曼旗| 江安县| 花莲市| 江陵县| 慈溪市| 安吉县| 绥化市| 凤城市| 二连浩特市| 祁连县| 遵化市| 浦城县| 敦化市| 黄骅市| 乌拉特后旗| 天全县| 鹤庆县| 健康| 南汇区| 钟祥市| 霍城县| 广饶县| 婺源县| 北票市| 桦甸市| 寿宁县| 安福县| 分宜县| 会昌县|