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),大 ...
随机推荐
- Win7环境下Sublime Text 3下安装NodeJS插件
1.首先下载安装Node.JS,配置好环境变量(安装好Node.JS默认是配置好了环境变量的). 2.Sublime Text 3下安装NodeJS插件. 参考的两篇文章:http://www.cnb ...
- 聪明的kk (南洋理工—171)
#include<iostream> using namespace std; ][]; ][]; int N, M; int dp(int i, int j) { ) return d[ ...
- Smtp错误码
Smtp错误码列表及相关原因 错误总表 420 1. Timeout Communication Problem Encountered During Transmission. Thie Is a ...
- 如何在MySQL中设置外键约束
引用:http://blog.sina.com.cn/s/blog_53729e4601011wja.html MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个: 一个是 ...
- Spring Boot整合实战Spring Security JWT权限鉴权系统
目前流行的前后端分离让Java程序员可以更加专注的做好后台业务逻辑的功能实现,提供如返回Json格式的数据接口就可以.像以前做项目的安全认证基于 session 的登录拦截,属于后端全栈式的开发的模式 ...
- 检测工具lynis
wget https://gitee.com/zzhlinux911218/software/raw/master/linux-inspect2.sh;bash linux-inspect2.sh检测 ...
- SVN历史版本比较中文乱码
将Workspace的编码改为UTF-8即可,详见上图:
- Eclipse设置控制台字体
打开 Window - preferences-- general - appearance - colors and fonts --debug - console font 进行设置.
- 我在B站学习 清华大学教授带你学习c++(进阶)类与对象
B站av11459203的一系列视频,跳过了基础篇直接进入进阶,从此难度开始加大.这里做出一些笔记分享一下. 我是1.25速度看的..对应分P 34-36 对象:现实中对象的模拟,具有属性和行为,对象 ...
- Helvetic Coding Contest 2016 online mirror F1
Description Heidi has finally found the mythical Tree of Life – a legendary combinatorial structure ...