Android使用token維持登陸狀態(tài)的方法
什么是token
token(令牌)是一串唯一的字符串,通常由服務(wù)端生成,在注冊完成時(shí)返回給客戶端,用來標(biāo)識(shí)此用戶,客戶端將此字符串存儲(chǔ)在本地。在以后的網(wǎng)絡(luò)請(qǐng)求時(shí),客戶端先查詢本地的token,如果有則直接使用此令牌進(jìn)行網(wǎng)絡(luò)請(qǐng)求,沒有則提示未登錄,轉(zhuǎn)到登陸注冊界面。
此外,還可以在服務(wù)端或者客戶端添加過期判別機(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é)束原來的主頁面
Toast.makeText(getApplicationContext(),"注冊成功",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(),"注冊失敗"+user.getmMessage(),Toast.LENGTH_SHORT).show();
}
}
});
我使用的是retrofit框架進(jìn)行網(wǎng)絡(luò)請(qǐng)求,上文是實(shí)現(xiàn)注冊功能的函數(shù),在onNext()函數(shù)中獲取服務(wù)端返回的結(jié)果,這個(gè)框架自動(dòng)把返回的json數(shù)據(jù)解析為對(duì)應(yīng)的類對(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,但并不建議這么做,雖然這樣很簡單。因?yàn)閡serId顯然無法判別是否過期,如果我們需要實(shí)現(xiàn)token過期的判別,則可以采用將userId與日期拼接的方式。
此外,為了安全起見,不要在客戶端生成token。
以上所述是小編給大家介紹的Android使用token維持登陸狀態(tài)的方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Android編程實(shí)現(xiàn)動(dòng)態(tài)支持多語言的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)動(dòng)態(tài)支持多語言的方法,涉及Android資源、控件及屬性相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
android listview 水平滾動(dòng)和垂直滾動(dòng)的小例子
android listview 水平滾動(dòng)和垂直滾動(dòng)的小例子,需要的朋友可以參考一下2013-05-05
Android 復(fù)制文本內(nèi)容到系統(tǒng)剪貼板的最簡單實(shí)例(分享)
下面小編就為大家?guī)硪黄狝ndroid 復(fù)制文本內(nèi)容到系統(tǒng)剪貼板的最簡單實(shí)例(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
android TextView多行文本(超過3行)使用ellipsize屬性無效問題的解決方法
這篇文章介紹了android TextView多行文本(超過3行)使用ellipsize屬性無效問題的解決方法,有需要的朋友可以參考一下2013-09-09
輕松實(shí)現(xiàn)功能強(qiáng)大的Android刮獎(jiǎng)效果控件(ScratchView)
這篇文章主要為大家詳細(xì)介紹了ScratchView如何一步步打造萬能的Android刮獎(jiǎng)效果控件,,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Android編程獲取手機(jī)后臺(tái)運(yùn)行服務(wù)的方法
這篇文章主要介紹了Android編程獲取手機(jī)后臺(tái)運(yùn)行服務(wù)的方法,涉及Android針對(duì)系統(tǒng)服務(wù)的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12

