nodejs的会话总结
前言:
http是一个无状态协议,所以客户端每次发出请求时,下一次请求就无法得知上一次请求所包含的状态数据,那么如何能把一个用户的状态数据关联起来?
1.cookie
一开始,人们采用cookie这门技术来解决这个问题,cookie是http协议中的一部分,它的处理过程如下:
1)服务器像客户端发送cookie
通常采用http协议规定的set-cookie头操作
规范规定cookie的格式为name=value的格式,且必须包含这部分
2)浏览器将cookie保存
3)浏览器每次请求时都会将cookie发给服务器
2.session
采用cookie的方式有一个很大的弊端,cookie中的所有数据再客户端就可以被修改,很不安全,那么一些重要的数据就不能存放在cookie中,于是就产生了session.而session中的数据是保存再服务端的,比较安全.
session通过一个特殊字段来与浏览器的cookie建立连接.
在express中,这个特殊字段默认是connet.sid.当请求到来时,服务端检查cookie中保存的connet.sid中的值,并通过这个值与服务器端的session的数据关联起来.这样浏览器与用户状态数据通过connect.sid这个新的字段来关联,客户端就无法修改保存在session中的用户状态了.
1)session存放方式
session的存放方式,分别是存放在:内存,cookie本身,缓存,数据库(也可以是文件),其中内存的存放方式适用于开发调试,内存的存放方式不方便进程间的共享,大多数应用都是采用缓存的方式来存储cookie.也有使用数据库的方式的,这种方式有一个大的缺点就是速度慢,在小型网站中,比如个人学习项目可以采用.
2)session的redis存储
redis既可以当做数据库来使用,也可以作为缓存来使用.
express中操作session要用到express-session,这个模块的使用方法,session(options),其中options中包含的可选参数主要有:
naem:设置cookie中,保存session的字段名称(默认为connect.sid)
store:session的存储方式,如果不使用该选项,则默认存放再内存中.
cookie:设置存放session id的cookie的相关选项,如果不使用该选项,则默认为:
- cookie:
- { path: '/', //表示cookie影响的路径,这里默认影响所有路径
- _expires: null, //时间格式
- originalMaxAge: null, //cookie保存时间
- httpOnly: true } } //一般情况下设置为true(默认)
rolling:每一个请求都重新设置一个cookie,默认为false
resave:及时session没有被修改,也保存session,默认true
如下再redis中存储session:
- const express = require('express');
- const session = require('express-session');
- const RedisStore = require('connect-redis')(session);
- let app = express()
- app.use(session({
- name: "qqqqqq",
- secret: 'wwwww',
- store: new RedisStore({
- host: '127.0.0.1',
- port: 6379
- }),
- resave: true,
- saveUninitialized: true,
- cookie:{
- 'maxAge':6000
- }
- }))
2)使用mongodb数据库存储session,类似redis
- const express = require('express')
- const session = require('express-session')
- const MongoStore = require('connect-mongo')(session)
- ....
- app.use(session({
- name: config.session.key, //设置cookie中保存session id的字段名称
- secret: config.session.secret, //通过secret来计算hash值并放在cookie中
- cookie: {
- maxAge: config.session.maxAge //过期时间,过期后cookie中的session id自动删除
- },
- store: new MongoStore({ //将session存储到mongodb
- url: config.mongodb //mongodb地址
- })
- }))
- ....
nodejs的会话总结的更多相关文章
- note.js之 Mongodb在Nodejs上的配置及session会话机制的实现
上篇我们使用nodejs实现了一个express4的网站构建配置,但一个有面的网站怎么可以缺少一个数据库呢.现在较为流行的就是使用MONGODB来作为nodejs网站引用的数据库,可能它与nodejs ...
- Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解
用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...
- 63.note.js之 Mongodb在Nodejs上的配置及session会话机制的实现
转自:https://www.cnblogs.com/alvin_xp/p/4751784.html 1.第一步安装mongodb数据库,这直接官网下载,这里不介绍. 2.也可以使用npm实现直接下载 ...
- NodeJs 开发微信公众号(四)微信网页授权
微信的网页授权指的是在微信公众号中访问第三方网页时获取用户地理.个人等信息的权限.对于开发了自己的网页app应用时,获取个人的信息非常重要.上篇博客讲到了注册时可以获取用户的信息,很多人会问为什么还需 ...
- NodeJs 开发微信公众号(三)微信事件交互
微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么 ...
- 转-基于NodeJS的14款Web框架
基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...
- JWT实现token-based会话管理
上文<3种web会话管理的方式>介绍了3种会话管理的方式,其中token-based的方式有必要从实现层面了解一下.本文主要介绍这方面的内容.上文提到token-based的实现目前有一个 ...
- 让你少走弯路的搭建树莓派的Net与NodeJS运行环境
树莓派是当前最火的嵌入计算平台没有之一,树莓派可以给我们无数的想象,树莓派的高性能.低功耗.低成本.可扩展性(最新的树莓派原生支持WIFI和蓝牙,这功能太赞了)深受大家的喜爱.虽然树莓派到目前为止 ...
- 大熊君大话NodeJS之------Connect中间件模块(第一季)
一,开篇分析 截止到今天来说,NodeJS系列文章已经有将近十篇了,让我们回顾一下: (1),大熊君大话NodeJS之开篇------Why NodeJS(将Javascript进行到底) (2),大 ...
随机推荐
- 杭电acm 1098题
Problem Description Ignatius is poor at math,he falls across a puzzle problem,so he has no choice bu ...
- 6.7 安装vim
- JavaScript学习系列6 -- JavaScript中的垃圾回收(内存释放)
程序开发中,涉及到的内存生命周期基本是一样的,分为以下三步 1. 分配需要的内存 2. 使用分配到的内存 3. 释放其内存 ----什么时候释放内存,以及需要释放哪些变量的内存, 就是垃圾回收机 ...
- TMF SID中的角色模式
角色模式 Copyright © TeleManagement Forum 2013. All Rights Reserved. This document and translations of i ...
- [CentOS7] 使用磁盘分割建立swap
声明:本文主要总结自:鸟哥的Linux私房菜-第七章.Linux 磁碟與檔案系統管理,如有侵权,请通知博主 通过 vim /etc/fstab 使该新建的swap分区每次开机都自己挂载 至此,已经完成 ...
- 输入类型<input type="number"> / input标签的输入限制
输入限制 属性 描述 disabled 规定输入字段应该被禁用. max 规定输入字段的最大值. maxlength 规定输入字段的最大字符数. min 规定输入字段的最小值. pattern 规定通 ...
- [Django笔记] django结构分析
看了一段时间django官方文档,先把自己理解的django目录结构记录一下 目录结构 一个成熟的django项目的结构大致如下: /project/ |-- project/ |-- setting ...
- Spark BlockManager 概述
Application 启动的时候: 1. 会在 SparkEnv 中实例化 BlockManagerMaster 和 MapOutputTracker,其中 (a) BlockManagerMast ...
- oracle例程
原创转载请注明出处 启动例程: 数据库启动例程的3个步骤 启动例程(NOMOUNT状态):读取参数文件,分配SGA和启动后台进程. 装载数据库(MOUNT状态):根据初始化参数control_file ...
- python之垃圾回收机制
一.前言 Python 是一门高级语言,使用起来类似于自然语言,开发的时候自然十分方便快捷,原因是Python在背后为我们默默做了很多事情,其中一件就是垃圾回收,来解决内存管理,内存泄漏的问题. 内存 ...