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

什么是token

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

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

token的作用

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

使用SharedPreferences保存token

获取token并保存

NetWorks.regPost(user, password, email, tel, new Observer<User>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {    Log.e("LoginActivity",e.getLocalizedMessage()+"--"+e.getMessage());}@Overridepublic 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);  }
@Overridepublic 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。

转载于:https://www.cnblogs.com/zhujiabin/p/7291891.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云RPA专有云产品文档集合

请访问以下链接&#xff1a; https://www.yuque.com/aliyun_rpa/

利用相机SDK采相转换至HImage

来源于http://blog.sina.com.cn/s/blog_d40acd530102xndm.html Halcon采相功能非常强大&#xff0c;基本支持各大品牌以及各个通信接口的相机&#xff0c;并且Halcon提供为相机厂商提供了制作Halcon相机接口库的办法&#xff0c;总之Halcon基本可以直接连接所有工业相机。 但…

java项目启动tomcat没报错,然后页面报404无法找到,重新编译后,出现以下状态...

严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListenerorg.springframework.beans.factory.BeanCreationException: Error creating bean with name MapperScannerConfigurer defined in c…

3.12PMP试题每日一题

哪一个是组织过程资产的事例&#xff1a;A、项目管理信息系统B、配置管理姿势库C、配置管理系统D、共享系统和云计算 作者&#xff1a;Tracy19890201&#xff08;同微信号&#xff09;转载于:https://blog.51cto.com/13554215/2361982

相机与镜头常识

1.焦距&#xff08;FocalLength&#xff09;   焦距是从镜头的中心点到胶平面上所形成的清晰影像之间的距离。焦距的大小决定着视角的大小&#xff0c;焦距数值小&#xff0c;视角大&#xff0c;所观察的范围也大&#xff1b;焦距数值大&#xff0c;视角小&#xff0c;观察范…

vsftpd的安装

简介 vsftpd是一个免费的开源的ftp服务器软件&#xff1b; 特点 小巧轻快&#xff0c;安全易用&#xff0c;支持虚拟用户、支持带宽限制等功能&#xff1b; 安装 执行 yum -y install vsftpd 创建虚拟用户(注意权限问题(chmod)&#xff0c;这个要根据情况来定) 选择在根或用户目…

halcon模板匹配测试流程

*1、创建模板&#xff08;获取要做模板区域的图像&#xff09; *create_shape_model (ImageReduced, 4, 0, rad(360), rad(1), none, use_polarity, 30, 10, ModelID) *2、获取形状模型---第二步&#xff08;为了显示找的的模板&#xff09; *get_shape_model_contours (…

企业云存储:为什么中大型企业偏爱自建私有云?

“上云&#xff1f;我们通常自建企业私有云。”9102年了&#xff0c;在云存储服务的选择上&#xff0c;中大型企业基本步调一致&#xff0c;统筹规划自建企业私有云。为什么中大型企业都偏爱自建企业私有云&#xff1f;一、长久的成本考量从账面上看&#xff0c;通常私有云初期…

ETL作业调度软件TASKCTL自定义扩展作业类型插件安装

TASKCTL批量自动化调度作业类型扩展插件的安装方法如下几种&#xff1a; 1、 直接覆盖法 直接覆盖法的意思就是将自定义扩展好的插件&#xff0c;通常是一个shell脚本&#xff0c;上传至后台调度核心服务上&#xff0c;然后修改后台任务类型的XML元素配置文件即可。 注意&#…

递归就这么简单

递归介绍 本来预算此章节是继续写快速排序的&#xff0c;然而编写快速排序往往是递归来写的&#xff0c;并且递归可能不是那么好理解&#xff0c;于是就有了这篇文章。 在上面提到了递归这么一个词&#xff0c;递归在程序语言中简单的理解是&#xff1a;方法自己调用自己 递归其…

阿里云RPA(机器人流程自动化)干货系列之二:认识RPA(下)

2019独角兽企业重金招聘Python工程师标准>>> 导读&#xff1a;本文是阿里云RPA&#xff08;机器人流程自动化&#xff09;干货系列之二&#xff0c;主要介绍了RPA的发展齐纳经和主要使用场景有哪些&#xff0c;目前国内外主流的RPA厂商以及RPA的未来在哪。 一、RPA的…

C# 图片的读取

//图片转成二进制public byte[] GetPictureData(string imagepath){/**/根据图片文件的路径使用文件流打开&#xff0c;并保存为byte[] FileStream FileStream new FileStream(imagepath, FileMode.Open);byte[] byData new byte[FileStream.Length];FileStream.Read(byData,…

SDOI2010 地精部落

题目描述 传说很久以前&#xff0c;大地上居住着一种神秘的生物&#xff1a;地精。 地精喜欢住在连绵不绝的山脉中。具体地说&#xff0c;一座长度为N的山脉H可分为从左到右的N段&#xff0c;每段有一个[b][u]独一无二[/u][/b]的高度Hi&#xff0c;其中Hi是1到N之间的正整数。 …

Codechef Yet another cute girl

题意大概就是让你求一下[L,R]中的约数个数是素数的数的个数。 其中1<L<R<1e12,R-L<1e6. 然后我写了两种做法&#xff0c;第一种是可以直接搞出来L-R的约数个数&#xff0c;然后直接统计一下就好了。 这个的复杂度大致是 O((R-L) * log(R-L)) 第二种就是需要先发现满…

简单弄一个-个人主页

--- 整理一下已经发表的文章 JAVA基础 java基础数据结构之-红黑树(插入)java基础数据结构之-红黑树(删除)了解一下jdk动态代理的本质了解一下cglib动态代理的本质SpringBoot源码解析 前言&#xff1a;阅读springboot源码之前&#xff0c;最好对spring源码有一定的了解&#xff…

Halocn OCR识别入门学习

一、建立OCR库 dev_close_window() read_image(Image,OCR) get_image_size(Image,Width,Hight) dev_open_window(0,0,Width,Hight,black,Window) dev_display(Image)*字符处理 rgb1_to_gray(Image,ImageGray) *鼠标画你要找的roi区域 draw_rectangle1(Window,Row1,Column1,Row…

ctsc2009 移民站选址

分析&#xff1a;非常非常好的一道题&#xff01; 首先需要对问题进行转化&#xff1a; 行列无关&#xff0c;对于行单独处理&#xff0c;对于列单独处理必然存在一个最优方案使得每一个新站与旧站重合.转化1很显然&#xff0c;对于转化2&#xff0c;是一类非常经典的“中位数问…

Jenkins 安装与使用--实例

參考了博客Jenkins master在windows上安装 Jenkins的主要功能是监视反复工作的运行&#xff0c;比如软件project的构建详细地&#xff1a; *软件的持续构建和測试 本质上提供了一个易于使用的持续集成系统。使得开发者更easy地将改变集成到project中。使得用户更easy获得一个…

后端项目搭建技术栈

Koa2&#xff1a;koa-bodyparser koa-router koa-session koa-corsTypeScript数据库&#xff1a;Mysql &#xff08;库&#xff1a;Sequelize&#xff09;表单验证库&#xff1a;Joi

C# 实体类几种深拷贝的方法——解决关于对象赋值,A=B,A改变,B也改变问题

几种常见的深拷贝方式 1、利用反射实现 public static T DeepCopyByReflection<T>(T obj) {   if (obj is string || obj.GetType().IsValueType)   return obj; object retval Activator.CreateInstance(obj.GetType());   FieldInfo[] fields obj.GetType().…