学习Token

Token是什么?

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

Token的引入——

Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生

使用Token的目的——

Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

如何使用Token?

两种使用方式:

  1. 用设备号/设备mac地址作为Token(推荐)

    客户端:客户端在登录的时候获取设备的设备号/mac地址,并将其作为参数传递到服务端。

    服务端:服务端接收到该参数后,便用一个变量来接收同时将其作为Token保存在数据库,并将该Token设置到session中,客户端每次请求的时候都要统一拦截,并将客户端传递的token和服务器端session中的token进行对比,如果相同则放行,不同则拒绝。 
    分析:此刻客户端和服务器端就统一了一个唯一的标识Token,而且保证了每一个设备拥有了一个唯一的会话。该方法的缺点是客户端需要带设备号/mac地址作为参数传递,而且服务器端还需要保存;优点是客户端不需重新登录,只要登录一次以后一直可以使用,至于超时的问题是有服务器这边来处理,如何处理?若服务器的Token超时后,服务器只需将客户端传递的Token向数据库中查询,同时并赋值给变量Token,如此,Token的超时又重新计时。

  2. 用session值作为Token

    客户端:客户端只需携带用户名和密码登陆即可。

    客户端:客户端接收到用户名和密码后并判断,如果正确了就将本地获取sessionID作为Token返回给客户端,客户端以后只需带上请求数据即可。

    分析:这种方式使用的好处是方便,不用存储数据,但是缺点就是当session过期后,客户端必须重新登录才能进行访问数据。

git-osc中Session 和 Token的使用 :

不久之前在学习登录时就第一次接触到了Token,但那个时候还不太清楚是怎么个情况,现在明白了:

当用户登录时,服务器会返回一个Session,在Session中夹有Token,拿到Token后,我们需要将token存起来。 
当下次用户在发送请求的时候,就不用再携带用户名和密码了,这样可以减轻服务器的负担,只需要携带Token和相应请求需要带的参数即可。

至此,我明白了几个问题:

  1. 之前学习源码时,不明白Token是干嘛的,现在明白了。
  2. 之前源码中,有很多地方getToken,那个时候不明白,现在明白了。
  3. 在请求数据时,在参数中,总要拼接一个token参数,那个时候不明白,现在明白了。
<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">    <span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*** 用户登录,将私有token保存* *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @param</span> appContext*<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @param</span> username*<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @param</span> password*<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @return</span> GitlabUser用户信息*<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @throws</span> IOException*/</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> User <span class="hljs-title" style="box-sizing: border-box;">login</span>(AppContext appContext, String userEmail,String password) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throws</span> AppException {String urlString = URLs.LOGIN_HTTPS;Session session = getHttpRequestor().init(appContext, HTTPRequestor.POST_METHOD, urlString).with(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"email"</span>, userEmail).with(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"password"</span>, password).to(Session.class);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 保存用户的私有token</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (session != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span> && session.get_privateToken() != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) {String token = CyptoUtils.encode(GITOSC_PRIVATE_TOKEN, session.get_privateToken());appContext.setProperty(PRIVATE_TOKEN, token);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> session;}</code>

Android学习总结(2)——App客户端与服务器交互中的token相关推荐

  1. Android学习系列(7)--App轮询服务器消息

    这篇文章是android开发人员的必备知识. 1.轮询服务器      一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务.     其中需要注意轮询的 ...

  2. Android学习系列(27)--App缓存管理

    随笔- 53 文章- 10 评论- 1064 Android学习系列(27)--App缓存管理 无论大型或小型应用,灵活的缓存可以说不仅大大减轻了服务器的压力,而且因为更快速的用户体验而方便了用户. ...

  3. Android学习系列(10)--App列表之拖拽ListView(上)

    研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨.       鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. ...

  4. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.       也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.       一看图啥都懂了: ...

  5. Android学习系列(34)--App应用之发布各广告平台版本

    Android的广告平台是很多的,各市场对各平台的接受程度是不一样的,Android的开发者如果想集成广告基本要考虑下面两个问题: (1)集成什么广告,会赚钱? (2)集成什么广告,不会被市场拒绝? ...

  6. Android学习系列(11)--App列表之拖拽ListView(下)

    接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法.      在这个方法中我们主要是处 ...

  7. Android学习笔记(四):在Activity中跳转--Intent的使用

    Android学习笔记(四):在Activity中跳转--Intent的使用 上篇,我们实战了一个很小的项目BMI,通过BMI这个项目,可以很好的理解Activity的程序结构,以方便后面高级API的 ...

  8. 客户端与服务器交互的功能,如何进行测试?

    测试客户端与服务器交互的功能,如何进行测试,需要考虑哪些内容呢?下面我们分阶段来说明一下~ 测试沟通阶段 需要跟客户端和服务器端开发沟通,确定客户端发送请求的样式,需要包含哪些参数值,参数值具体有什么 ...

  9. h5+app客户端获取服务器传过来的cookie

    接上一篇 在开发h5+手机app时,服务器写到客户端的cookie却无法正常获取 一.错误方法 1.后端设置cookie(用来设置会员15天免登陆) Cookie phone = new Cookie ...

最新文章

  1. 12、HTML DOM
  2. MapReduce论文中文版
  3. 素数p阶群乘法循环群啥意思_抽象代数2-3 群元素的阶和循环群
  4. 将长方形木框拉成平行四边形_【减负提质进行时】平行四边形的面积再思考
  5. 7、mybatis中的sql映射文件详解(2)
  6. ScintillaNET的应用
  7. 【ARM汇编】ARM 指令集和Thumb 指令集
  8. windows10未安装画图工具解决办法
  9. 避免侵权!这10个免费可商用的图片网站,请一定收好
  10. 一起学习Spring boot 2.1.X | 第十五篇:登陆拦截器
  11. 【FTP】错误描述:200 Switching to ASCII mode,227 Entering Passive Mode
  12. mysql升级 增删改查询
  13. 《JavaScript权威指南第7版》第11章 JavaScript标准库
  14. 混凝土抗压弹性模量自动计算表_2011混凝土弹性模量试验.doc
  15. 开源开放 | 面向家庭常见疾病的知识图谱(东南大学)
  16. 鸿蒙系统会应用在平板电脑,华为将发布搭载鸿蒙系统的平板电脑-芯查查
  17. 第三方支付交易简单流程
  18. Premiere Pro Guru: Online Offline Workflows Premiere Pro 大师教程之在线与离线工作流 Lynda课程中文字幕
  19. IEEE802是什么?
  20. UML类图中类与类之间的关系

热门文章

  1. 力扣打家劫舍系列总结
  2. 用计算机名怎么共享电视盒,机顶盒怎么通过电脑实现局域网共享
  3. linux跳转乌班图服务器,Linux-Ubuntu环境安装Nginx和配置二级域名跳转
  4. string list 查找_手撕java集合源码——List篇
  5. linux的实际作用是什么,libcxxabi在linux下有意义吗?有什么好处?
  6. php十二星座_php计算十二星座的函数代码
  7. python的django介绍_django Django简介 - 刘江的django教程
  8. mongo3.5 java cursor,Spring Data MongoDB-需要'cursor'选项
  9. 熟悉mysql数据库设计和性能优化_Mysql数据库性能优化
  10. java socket 消息中转,Java中Socket实现消息传输(传输原型)