nodejs如何使用session

现在很多node.js项目都使用express来做的,不得不承认这个框架很火热。很多需求只需要安装插件简单配置就可以快速应用到项目中。有个问题:
如果不依赖框架,不使用第三方模块,设计一个登陆,如何使用session和cookie,原理是什么?

阅读 3.5k
1 个回答

本来想详细讲解一下的,想想还是算了,简单列一下登录认证过程中,就应该能理解了

客户端: 我要查看用户资料
服务端: 你没有凭证(cookie),请先获得凭证再来,获得凭证需要你提供用户名密码。
客户端: 好的,这是我的用户名和密码
服务端: 验证通过,现在为你生成凭证,请保管好,以后只认凭证,就算阿猫阿狗拿着你的凭证来查资料,我也会给他。
。。。
客户端:我要查用户资料,这是我的凭证.
服务端:好的,请稍等,我确认一下你的凭证是否真的,OK,是真的,资料拿去。
。。。
客户端:我要查用户资料,这是我的凭证.
服务端:对不起,你的凭证已经过期失效了,请重新提供用户名密码获得新的凭证。

OK,再来讲一下怎么生成凭证和怎么验证凭证:

生成的条件是验证用户提供的用户名和密码是对的,

a. 生成随机唯一的session_id, 比如md5(用户id+毫秒数)

b. 生成session内容,并建立session_id与session内容的对应关系

即服务端拿一本帐本,记录下这个凭证(根椐标识)对应的用户名(一般是用户ID)是谁,类似:
abcd123 => 'Tim',
ee22343 => 'You'

(这个对应关系,可以保存在文件、memcache、数据库等等,这就是用不同介质保存session的原理)

c. 将session_id加密、签名,写到凭证中,返回客户端。

用通俗语言来描述这个过程就是:

验证用户名密码正确后

服务端拿出一张纸,随机写上一个标识(比如像医生写病历,有一定的防伪性) ---- session_id
再拿出帐本,写上这个“标识”与“用户”的关联,表示这个标识就等同于用户A ----session_id与session内容关联
给这张纸盖上大印 ----session_id加密和防伪
将这张纸作为凭证,交给用户 ---- 将加密后的session_id作为cookie返回。

最后,用户下次来请求,带上了凭证,服务端验证过程:

  1. 有凭证
  2. 看看大印是否自己的(验证有效性)
  3. 读取凭证中的标识(嗯,一般只有医生能读懂自己写的东西)
  4. 拿出帐本,查找标识对应的用户,有找到,验证成功,返回相关内容

其它:
凭证有效期:比如可以约定,一天后就没有用了
帐本有效期:session也是可以有效期的,比如我每隔一小时就删除一些没有用到的session,清理之后,就算你的凭证是真实的,但也无效了。

最后,cookie是标准实现,无所谓自己实现(你可能只是需要封装操作指令),要自己实现session的话,无非就是解决这几个问题:
1)决定你的帐本(用什么方式保存)
2) 实现写帐本(根据session_id写数据)
3) 实现读帐本(按session_id读数据)
4) 实现清理帐本过期数据

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题