欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android使用token维持登陆状态的方法

程序员文章站 2024-02-13 18:23:28
什么是token 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。

以上所述是小编给大家介绍的android使用token维持登陆状态的方法,希望对大家有所帮助