您好,登錄后才能下訂單哦!
Android開發中使用token如何實現維持登陸狀態?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
什么是token
token(令牌)是一串唯一的字符串,通常由服務端生成,在注冊完成時返回給客戶端,用來標識此用戶,客戶端將此字符串存儲在本地。在以后的網絡請求時,客戶端先查詢本地的token,如果有則直接使用此令牌進行網絡請求,沒有則提示未登錄,轉到登陸注冊界面。
此外,還可以在服務端或者客戶端添加過期判別機制。
token的作用
token可以顯著減少服務端對用戶表的查詢,同時使用戶不必每次都登陸,提高了系統的可用性與健壯性。
使用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();//結束原來的主頁面 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框架進行網絡請求,上文是實現注冊功能的函數,在onNext()函數中獲取服務端返回的結果,這個框架自動把返回的json數據解析為對應的類對象(即上文中的user對象)。因為token的本質是唯一的字符串,userId滿足這個要求,因為userId是由服務端生成且唯一,故我將userId作為token使用。
進行網絡請求前查詢本地token
比如點擊側邊欄的頭像,如果未登錄則需要跳轉到登陸界面,已經登陸則進入個人信息界面。這時候,就需要查詢本地token進行判別。
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,但并不建議這么做,雖然這樣很簡單。因為userId顯然無法判別是否過期,如果我們需要實現token過期的判別,則可以采用將userId與日期拼接的方式。
此外,為了安全起見,不要在客戶端生成token。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。