Android使用token維持登陸狀態(tài)的方法
什么是token
token(令牌)是一串唯一的字符串,通常由服務(wù)端生成,在注冊(cè)完成時(shí)返回給客戶端,用來(lái)標(biāo)識(shí)此用戶,客戶端將此字符串存儲(chǔ)在本地。在以后的網(wǎng)絡(luò)請(qǐng)求時(shí),客戶端先查詢本地的token,如果有則直接使用此令牌進(jìn)行網(wǎng)絡(luò)請(qǐng)求,沒(méi)有則提示未登錄,轉(zhuǎn)到登陸注冊(cè)界面。
此外,還可以在服務(wù)端或者客戶端添加過(guò)期判別機(jī)制。
token的作用
token可以顯著減少服務(wù)端對(duì)用戶表的查詢,同時(shí)使用戶不必每次都登陸,提高了系統(tǒng)的可用性與健壯性。
使用SharedPreferences保存token
獲取token并保存
NetWorks.regPost(user, password, email, tel, new Observer<User>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { Log.e("LoginActivity",e.getLocalizedMessage()+"--"+e.getMessage()); } @Override public void onNext(User user) { if(user.getmMessage().equals("success")){ MainActivity.instance.finish();//結(jié)束原來(lái)的主頁(yè)面 Toast.makeText(getApplicationContext(),"注冊(cè)成功",Toast.LENGTH_SHORT).show(); //token保存到本地 SharedPreferences sp = getSharedPreferences("loginToken", 0); SharedPreferences.Editor editor = sp.edit(); editor.putString("userId",user.getmUserId()); editor.putString("userName",user.getmUserName()); editor.putString("phone",user.getmPhone()); editor.putString("email",user.getmEmail()); editor.putString("headImageUrl",user.getmHeadImageUrl()); editor.commit(); Intent i = new Intent(RegActivity.this,MainActivity.class); startActivity(i); finish(); }else{ Toast.makeText(getApplicationContext(),"注冊(cè)失敗"+user.getmMessage(),Toast.LENGTH_SHORT).show(); } } });
我使用的是retrofit框架進(jìn)行網(wǎng)絡(luò)請(qǐng)求,上文是實(shí)現(xiàn)注冊(cè)功能的函數(shù),在onNext()函數(shù)中獲取服務(wù)端返回的結(jié)果,這個(gè)框架自動(dòng)把返回的json數(shù)據(jù)解析為對(duì)應(yīng)的類(lèi)對(duì)象(即上文中的user對(duì)象)。因?yàn)閠oken的本質(zhì)是唯一的字符串,userId滿足這個(gè)要求,因?yàn)閡serId是由服務(wù)端生成且唯一,故我將userId作為token使用。
進(jìn)行網(wǎng)絡(luò)請(qǐng)求前查詢本地token
比如點(diǎn)擊側(cè)邊欄的頭像,如果未登錄則需要跳轉(zhuǎn)到登陸界面,已經(jīng)登陸則進(jìn)入個(gè)人信息界面。這時(shí)候,就需要查詢本地token進(jìn)行判別。
private void initData() { sp = getSharedPreferences("loginToken", 0); name = sp.getString("userId", null); userName = sp.getString("userName", null); email = sp.getString("email", null); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.imageView: if (name == null) { Intent i = new Intent(MainActivity.this, LoginActivity.class); startActivity(i); } else { Log.d("用戶ID", name); Intent i = new Intent(MainActivity.this, PersonInfoActivity.class); startActivity(i); } break; } }
備注
在此例中,我使用userId作為token,但并不建議這么做,雖然這樣很簡(jiǎn)單。因?yàn)閡serId顯然無(wú)法判別是否過(guò)期,如果我們需要實(shí)現(xiàn)token過(guò)期的判別,則可以采用將userId與日期拼接的方式。
此外,為了安全起見(jiàn),不要在客戶端生成token。
以上所述是小編給大家介紹的Android使用token維持登陸狀態(tài)的方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
關(guān)于android studio通過(guò)命令行運(yùn)行g(shù)radle編譯命令的問(wèn)題
這篇文章主要介紹了關(guān)于android studio通過(guò)命令行運(yùn)行g(shù)radle編譯命令的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11Android實(shí)現(xiàn)電池管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)電池管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Android RecyclerView滾動(dòng)定位
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView滾動(dòng)定位的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01在當(dāng)前Activity之上創(chuàng)建懸浮view之WindowManager懸浮窗效果
這篇文章主要介紹了在當(dāng)前Activity之上創(chuàng)建懸浮view之WindowManager懸浮窗效果的相關(guān)資料,需要的朋友可以參考下2016-01-01Android SQLite數(shù)據(jù)庫(kù)進(jìn)行查詢優(yōu)化的方法
這篇文章主要給大家介紹了關(guān)于Android SQLite數(shù)據(jù)庫(kù)進(jìn)行查詢優(yōu)化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11Android?換膚實(shí)現(xiàn)指南demo及案例解析
這篇文章主要為大家介紹了Android換膚指南demo及案例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06SimpleCommand框架介紹以及簡(jiǎn)單使用(一)
這篇文章主要為大家詳細(xì)介紹了SimpleCommand框架以及簡(jiǎn)單使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10使用Flutter 構(gòu)建Web應(yīng)用邏輯解析
這篇文章主要為大家介紹了使用Flutter 構(gòu)建Web應(yīng)用邏輯解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Android開(kāi)發(fā)中RecyclerView模仿探探左右滑動(dòng)布局功能
本文給大家分享android開(kāi)發(fā)中RecyclerView模仿探探左右滑動(dòng)布局功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01Android編程實(shí)現(xiàn)Toast自定義布局簡(jiǎn)單示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)Toast自定義布局的方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了Toast自定義布局的實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-02-02