Android端實現(xiàn)單點登錄的方法詳解
前言
單點登錄SSO(Single Sign On)說得簡單點就是在一個多系統(tǒng)共存的環(huán)境下,用戶在一處登錄后,就不用在其他系統(tǒng)中登錄,也就是用戶的一次登錄能得到其他所有系統(tǒng)的信任。單點登錄在大型網(wǎng)站里使用得非常頻繁,例如像阿里巴巴這樣的網(wǎng)站,在網(wǎng)站的背后是成百上千的子系統(tǒng),用戶一次操作或交易可能涉及到幾十個子系統(tǒng)的協(xié)作,如果每個子系統(tǒng)都需要用戶認(rèn)證,不僅用戶會瘋掉,各子系統(tǒng)也會為這種重復(fù)認(rèn)證授權(quán)的邏輯搞瘋掉。實現(xiàn)單點登錄說到底就是要解決如何產(chǎn)生和存儲那個信任,再就是其他系統(tǒng)如何驗證這個信任的有效性,因此要點也就以下兩個:
存儲信任
驗證信任
如果一個系統(tǒng)做到了開頭所講的效果,也就算單點登錄,下面就來看看在Android端實現(xiàn)單點登錄的方法。
服務(wù)端
服務(wù)端需要集成Token,每次在app登錄時為app分配新的token,如果在某次http請求中app傳遞token不是最新的,則視為需要重新登錄(或者根據(jù)自己需要后臺設(shè)定token有效時間,過期視為Token失效,需要重新登錄).在token失效的情況下,返回約定好的code
Android端監(jiān)聽
App如何知道已經(jīng)在其他設(shè)備登錄了呢,一般可以有三種方式
1.api請求中后臺返回特定code
這種是最常見的方式,缺點是需要下次api請求才知道被踢下線,可以在網(wǎng)絡(luò)層實體模型的基類BaseModel中處理,對code進(jìn)行判斷
switch (code) { case 1: break; case 3://被踢下線 //Do Something break; }
2.推送
后臺推送給app,從而app得知該賬戶在其他設(shè)備登錄了,進(jìn)而執(zhí)行下線操作,優(yōu)點是可以及時響應(yīng)
3.使用第三方的監(jiān)聽器
很多時候app會集成一些第三方的賬戶系統(tǒng),例如在集成了環(huán)信的app中,每個用戶對應(yīng)一個環(huán)信的imUserName,環(huán)信自身有提供連接狀態(tài)的接聽,通過監(jiān)聽環(huán)信的用戶狀態(tài),從而達(dá)到監(jiān)聽app自身用戶系統(tǒng)的效果
EMClient.getInstance().addConnectionListener(this);
Android被踢下線后的操作
不管是哪種監(jiān)聽方式,最后的操作都是一樣的,可以根據(jù)自己的需求進(jìn)行對應(yīng)的操作.這里提供一種常規(guī)化的下線流程.
從棧頂取到當(dāng)前的前臺Activity,Dialog提示用戶,點擊后跳轉(zhuǎn)登錄頁
首先,任意地方獲取到前臺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(); } }); }
這里做一些說明
由于監(jiān)聽到被踢下線的環(huán)境不一定在主線程,所以需要切換到主線程進(jìn)行彈出Dilaog
new Handler(Looper.getMainLooper()).post(Runnable r)
這里的dialog是強(qiáng)制的,取消不了(這里dialog是自定義的,用系統(tǒng)的也是可以的,這不是重點)
builder.cancelable(false); builder.canceledOnTouchOutside(false);
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對各位Android開發(fā)者們能有所幫助,如果有疑問大家可以留言交流。
相關(guān)文章
Android 中RecycleView實現(xiàn)item的點擊事件
這篇文章主要介紹了Android 中RecycleView實現(xiàn)item的點擊事件的相關(guān)資料,需要的朋友可以參考下2017-03-03深入理解Android中的Window和WindowManager
這篇文章給大家介紹了Window和WindowManager知識,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-02-02Android實現(xiàn)整理PackageManager獲取所有安裝程序信息
這篇文章主要介紹了Android實現(xiàn)整理PackageManager獲取所有安裝程序信息的方法,實例分析了Android使用PackageManager獲取安裝程序信息的具體步驟與相關(guān)技巧,需要的朋友可以參考下2016-01-01Android中通過ActionBar為標(biāo)題欄添加搜索及分享視窗
這篇文章主要介紹了ANDROID中通過ACTIONBAR為標(biāo)題欄添加搜索以及分享視窗的相關(guān)資料,需要的朋友可以參考下2016-12-12Android ContentProvider獲取手機(jī)聯(lián)系人實例
這篇文章主要介紹了Android ContentProvider獲取手機(jī)聯(lián)系人實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02Google 開發(fā)Android MVP架構(gòu)Demo深入解析
這篇文章主要為大家介紹了Google 開發(fā)Android MVP架構(gòu)Demo深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Android USB轉(zhuǎn)串口通信開發(fā)實例詳解
這篇文章主要介紹了 Android USB轉(zhuǎn)串口通信開發(fā)實例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04使用Android原生WebView+Highcharts實現(xiàn)可左右滑動的折線圖
折線圖是Android開發(fā)中經(jīng)常會碰到的效果,但由于涉及自定義View的知識,對許多剛?cè)腴T的小白來說會覺得很高深,下面這篇文章主要給大家介紹了關(guān)于如何使用Android原生WebView+Highcharts實現(xiàn)可左右滑動的折線圖的相關(guān)資料,需要的朋友可以參考下2022-05-05