热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

这篇文章主要介绍了Android使用token维持登陆状态的方法,包括token的概念及作用介绍,本文给大家介绍的非常详细,需要的朋友参考下吧

什么是token

token(令牌)是一串唯一的字符串,通常由服务端生成,在注册完成时返回给客户端,用来标识此用户,客户端将此字符串存储在本地。在以后的网络请求时,客户端先查询本地的token,如果有则直接使用此令牌进行网络请求,没有则提示未登录,转到登陆注册界面。

此外,还可以在服务端或者客户端添加过期判别机制。

token的作用

token可以显著减少服务端对用户表的查询,同时使用户不必每次都登陆,提高了系统的可用性与健壮性。

使用SharedPreferences保存token

获取token并保存

NetWorks.regPost(user, password, email, tel, new Observer() {
   @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维持登陆状态的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


推荐阅读
  • MySQL 8.0 新特性详解:免费视频教程上线
    本文介绍了一套在慕课网上发布的免费视频教程,深入解析 MySQL 8.0 的核心新功能,包括增强的安全性、用户管理、新的索引类型、CTE 和窗口函数等。 ... [详细]
  • IEC60825激光产品安全标准详解
    随着激光技术在全球范围内的广泛应用,尤其是激光投影显示技术的兴起,了解和遵守相关的安全标准变得尤为重要。本文将详细介绍IEC60825激光产品安全标准及其重要性。 ... [详细]
  • 第1章选择流程控制语句1.1顺序结构的基本使用1.1.1顺序结构概述是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行 ... [详细]
  • 深入理解异步多线程编程模型
    现代计算机系统中的CPU通过并行处理提高效率,但所谓的并发处理实际上是一种基于轮询的模拟并行。本文探讨了现代处理器如何通过虚拟化技术实现更高的并发性能,以及在.NET框架中如何有效利用线程和异步编程模式。 ... [详细]
  • 本文探讨了 Boost 库中的 Program Options 组件,这是一个强大的工具,用于解析命令行参数和配置文件。文章介绍了如何正确设置和使用该组件,包括处理复杂选项和负数值的方法。 ... [详细]
  • 本文通过具体示例详细介绍了 Python 中的装饰器和装饰类的使用方法,包括带参数的装饰器和装饰类的应用场景。 ... [详细]
  • 解决 Pytest 运行时出现 FileNotFoundError 的方法
    在使用 Pytest 进行测试时,可能会遇到 FileNotFoundError 错误,提示无法找到指定的文件或目录。本文将探讨该错误的原因及解决方案。 ... [详细]
  • HDU1085 捕获本·拉登!
    问题描述众所周知,本·拉登是一位臭名昭著的恐怖分子,他已失踪多年。但最近有报道称,他藏匿在中国杭州!虽然他躲在杭州的一个洞穴中不敢外出,但近年来他因无聊而沉迷于数学问题,并声称如果有人能解出他的题目,他就自首。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • 深入解析mt_allocator内存分配器(二):多线程与单线程场景下的实现
    本文详细介绍了mt_allocator内存分配器在多线程和单线程环境下的实现机制。该分配器以2的幂次方字节为单位分配内存,支持灵活的配置和高效的性能。文章分为内存池特性描述、内存池实现、单线程内存池实现、内存池策略类实现及多线程内存池实现等部分,深入探讨了内存池的初始化、内存分配与回收的具体实现。 ... [详细]
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
  • 深入解析 RuntimeClass 及多容器运行时应用
    本文旨在探讨RuntimeClass的起源、功能及其在多容器运行时环境中的实际应用。通过详细的案例分析,帮助读者理解如何在Kubernetes集群中高效管理不同类型的容器运行时。 ... [详细]
  • 本文详细介绍了Objective-C中的面向对象编程概念,重点探讨了类的定义、方法的实现、对象的创建与销毁等内容,旨在帮助开发者更好地理解和应用Objective-C的面向对象特性。 ... [详细]
  • 最新进展:作为最接近官方声明的信息源,本文吸引了大量关注。若需获取最新动态,请访问:lkhill.com/ccie-version-5-update ... [详细]
  • APP及其接口测试全面解析
    本文深入探讨了移动应用(APP)及其接口测试的关键点,包括安装与卸载、功能一致性、系统兼容性、权限管理等多个方面的测试策略,以及针对接口的功能、边界值、参数组合等专业测试方法。同时,介绍了几款常用的测试工具,帮助开发者提高测试效率和质量。 ... [详细]
author-avatar
morimodomasaaki
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有