Token

本文深入解析Token和Session的概念及其在Android客户端与服务端的应用。通过介绍两种Token使用方式,探讨了它们的优势与不足,并提出了使用过程中可能遇到的问题及解决方案。
Android客户端和服务端如何使用Token和Session
2014-09-16 16:38:44
标签: Android Session Token
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://wyong.blog.51cto.com/1115465/1553352

    对于初学者来说,对Token和Session的使用难免会限于困境,开发过程中知道有这个东西,但却不知道为什么要用他?更不知道其原理,今天我就带大家一起分析分析这东西。

    一、我们先解释一下他的含义:

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

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

    3、使用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过期后,客户端必须重新登录才能进行访问数据。

    三、使用过程中出现的问题以及解决方案?

    刚才我们轻松介绍了Token的两种使用方式,但是在使用过程中我们还出现各种问题,Token第一种方法中我们隐藏了一个在网络不好或者并发请求时会导致多次重复提交数据的问题。

    该问题的解决方案:将session和Token套用,如此便可解决,如何套用呢?请看这段解释:

650) this.width=650;” src=”http://s3.51cto.com/wyfs02/M02/49/A9/wKioL1QX85nCkJ5qAABWcdNyC0g731.png” title=”session.PNG” alt=”wKioL1QX85nCkJ5qAABWcdNyC0g731.png” onabort=”” onblur=”” onchange=”” onclick=”” ondblclick=”” onerror=”” onfocus=”” onkeydown=”” onkeypress=”” onkeyup=”” onmousedown=”” onmousemove=”” onmouseout=”” onmouseover=”” onmouseup=”” onreset=”” onresize=”” onselect=”” onsubmit=”” onunload=”” width=”650”>

     这就是解决重复提交的方案。

     总结:以上是个人对开发中使用Token和session的一点总结,如有叙述不当之处请指正,我将及时改正并感谢,我知道还有更多更好的使用方式,我在这里只是抛砖引玉,希望大家将您的使用方式提出来,我们一起讨论,学习,一起进步,同时也为像我一样对这方面理解薄弱的朋友提供点帮助,谢谢。


本文出自 “吸博取精自我更新” 博客,请务必保留此出处http://wyong.blog.51cto.com/1115465/1553352

function iFrameHeight() { var ifm= document.getElementById("iframepage"); var subWeb = document.frames ? document.frames["iframepage"].document : ifm.contentDocument; if(ifm != null && subWeb != null) { ifm.height = subWeb.body.scrollHeight; } } var kevent = 'onabort|onblur|onchange|onclick|ondblclick|onerror|onfocus|onkeydown|onkeypress|onkeyup|onload|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onreset|onresize|onselect|onsubmit|onunload'; var aevent = kevent.split('|'); jQuery('.showContent img').each(function(){ var nimg = this; jQuery.each(aevent, function(i, n){ if (n!='onload') { jQuery(nimg).attr(n, ''); } else { if (jQuery(nimg).attr(n) != 'if(this.width>650) this.width=650;') { jQuery(nimg).attr(n, ''); } } }); }); var encodetitle = encodeURI('一篇很棒的博文分享给大家:《Android客户端和服务端如何使用Token和Session》'); function show51share(){ window.open('http://t.51cto.com/index.php?m=share&url=http://wyong.blog.51cto.com/1115465/1553352&type=l&count=&relateUid=&appkey=3843950324&title=' + encodetitle); }
分享至
### 三级标题:Token 在计算机安全中的验证机制 在计算机安全领域,Token 是一种用于身份验证和授权的重要工具。通常情况下,用户首次登录系统时提供用户名和密码,服务器验证这些凭据后生成一个 Token,并将其返回给客户端。客户端在后续请求中携带这个 Token,服务器通过验证 Token 来确认用户身份,从而避免重复输入账号密码的过程 [^2]。 #### Token 的生成与结构 Token(尤其是 JWT)通常由三部分组成:头部(Header)、负载(Payload)和签名(Signature)。头部包含 Token 的类型和使用的签名算法;负载包含用户信息和其他元数据;签名则是将头部和负载使用密钥进行加密的结果,确保 Token 不被篡改 [^4]。 例如,使用 Node.js 和 `jsonwebtoken` 库生成 Token 的代码如下: ```javascript const jwt = require('jsonwebtoken'); // 签发 Token const token = jwt.sign({ userId: '12345', role: 'admin' }, secretKey, { expiresIn: '1h' }); ``` #### Token 验证过程 当客户端发送请求时,携带的 Token 会被服务器解析并验证其有效性。验证过程包括检查 Token 的签名是否正确、是否过期以及是否有其他非法修改。如果签名不匹配,则会返回类似 `invalid signature` 的错误提示,表明提供的密钥与签发 Token 时使用的密钥不一致 [^1]。 例如,验证 Token 的代码如下: ```javascript jwt.verify(token, secretKey, (error, decoded) => { if (error) { console.error("Token 验证失败:", error.message); } else { console.log("解码后的用户信息:", decoded); } }); ``` #### Token 的存储与管理 为了提高系统的安全性,Token 通常具有一定的有效期,并且需要妥善存储。常见的做法是将 Token 存储在 Redis 数据库中,以便快速查询和管理。以下是一个 PHP 函数示例,用于检查用户的 Token 是否有效: ```php public function checkUserToken($token) { if (!$token) { $this->returnMsg(401, 'token参数缺失!'); } if (!Session::has($token)) { $this->returnMsg(401, '请先登录!'); } return session($token); } ``` #### 安全性注意事项 - **密钥管理**:Token 的签名依赖于密钥,因此必须确保密钥的安全性。如果密钥泄露或不匹配,会导致 Token 被拒绝或伪造。 - **有效期控制**:Token 通常设置较短的有效期以减少风险,同时可以结合刷新 Token 的机制延长会话时间。 - **防止重放攻击**:通过记录已使用的 Token 或使用一次性 Nonce 值,可以有效防止 Token 被恶意重复使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值