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),大 ...
随机推荐
- JSP有哪些动作?
JSP使用动作来动态的插入文件,实现重定向和对JavaBean的引用等功能.它公有6个基本动作:jsp:include,jsp:useBean,jsp:setProperty,jsp:getPrope ...
- 教育网bt站点
北京交通大学 晨光BT (http://cgbt.cn)清华晨光BT(http://thubt.cn)北京科技大学 iBeiKeBT(http://bt.ibeike.com)上海大学 乐乎BT (h ...
- Umbraco 的template使用的默认Model问题
Umbraco中的Template默认都继承自 Umbraco.Web.Mvc.UmbracoTemplatePage @inherits Umbraco.Web.Mvc.UmbracoTemplat ...
- C#类和类的实例
类 ,顾名思义就是分类.类别的意思.我们要面向对象编程,就需要对不同的事物进行分类.类可以说是.net面向对象的核心. 类:就是具有相同的属性和功能的对象的抽象的集合. 1.类的定义 <访问修 ...
- Python中读取,显示,保存图片的方法
一 opencv import cv2 as cv # load img = cv.imread(imagepath) # shape=(height, width, channel) h,w,c = ...
- Boost Python官方样例(三)
导出C++类(纯虚函数和虚函数) 大致做法就是为class写一个warp,通过get_override方法检测虚函数是否被重载了,如果被重载了调用重载函数,否则调用自身实现,最后导出的时候直接导出wa ...
- JAVA对象创建的过程
Java中一个实例对象被创建的过程 一.类的加载过程 首先,Jvm在执行时,遇到一个新的类时,会到内存中的方法区去找class的信息,如果找到就直接拿来用,如果没有找到,就会去将类文件加载到方法区.在 ...
- PHP中的继承
<?php class Bar { private $salary = 3000; public $lunch = 1000; // php中关于“可见性”的概念 public function ...
- go语言实战教程:实战项目资源导入和项目框架搭建
从本节内容开始,我们将利用我们所学习的Iris框架的相关知识,进行实战项目开发. 实战项目框架搭建 我们的实战项目是使用Iris框架开发一个关于本地服务平台的后台管理平台.平台中可以管理用户.商品.商 ...
- uva 10817(数位dp)
uva 10817(数位dp) 某校有m个教师和n个求职者,需讲授s个课程(1<=s<=8, 1<=m<=20, 1<=n<=100).已知每人的工资c(10000 ...