前言:

  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的会话总结的更多相关文章

  1. note.js之 Mongodb在Nodejs上的配置及session会话机制的实现

    上篇我们使用nodejs实现了一个express4的网站构建配置,但一个有面的网站怎么可以缺少一个数据库呢.现在较为流行的就是使用MONGODB来作为nodejs网站引用的数据库,可能它与nodejs ...

  2. Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解

    用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...

  3. 63.note.js之 Mongodb在Nodejs上的配置及session会话机制的实现

    转自:https://www.cnblogs.com/alvin_xp/p/4751784.html 1.第一步安装mongodb数据库,这直接官网下载,这里不介绍. 2.也可以使用npm实现直接下载 ...

  4. NodeJs 开发微信公众号(四)微信网页授权

    微信的网页授权指的是在微信公众号中访问第三方网页时获取用户地理.个人等信息的权限.对于开发了自己的网页app应用时,获取个人的信息非常重要.上篇博客讲到了注册时可以获取用户的信息,很多人会问为什么还需 ...

  5. NodeJs 开发微信公众号(三)微信事件交互

    微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么 ...

  6. 转-基于NodeJS的14款Web框架

    基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...

  7. JWT实现token-based会话管理

    上文<3种web会话管理的方式>介绍了3种会话管理的方式,其中token-based的方式有必要从实现层面了解一下.本文主要介绍这方面的内容.上文提到token-based的实现目前有一个 ...

  8. 让你少走弯路的搭建树莓派的Net与NodeJS运行环境

      树莓派是当前最火的嵌入计算平台没有之一,树莓派可以给我们无数的想象,树莓派的高性能.低功耗.低成本.可扩展性(最新的树莓派原生支持WIFI和蓝牙,这功能太赞了)深受大家的喜爱.虽然树莓派到目前为止 ...

  9. 大熊君大话NodeJS之------Connect中间件模块(第一季)

    一,开篇分析 截止到今天来说,NodeJS系列文章已经有将近十篇了,让我们回顾一下: (1),大熊君大话NodeJS之开篇------Why NodeJS(将Javascript进行到底) (2),大 ...

随机推荐

  1. leetcode-002

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

  2. LightOJ 1311 Unlucky Bird (物理题)

    题意:有点长,意思是说有一个鸟,在两列火车之间不停的来回飞,两列相距为d时,都开始减速,直到最后停止下来,正好是相距0米, 现在给定两列车的速度和减速时的加速度,和鸟的速度求 d 和鸟飞过的路程. 析 ...

  3. idea使用的知识

    1. 如何设置,使IntelliJ IDEA智能提示忽略大小写.    很好用,在settings->Editor->General-->Code Completion里设置.2. ...

  4. 为什么源码中很多方法就一行throw new RuntimeException("Stub!")

    在使用某些类的方法时,发现其内部就一行throw new RuntimeException("Stub!"),但是实际运行中并没有抛出该错误,该方法也并没有语法报错. 因此可能是系 ...

  5. redis集群搭建踩坑笔记

    推荐参考教程:https://blog.csdn.net/pucao_cug/article/details/69250101 错误: from /usr/lib/ruby/2.3.0/rubygem ...

  6. Netty 线程模型与Reactor 模式

    前言 Netty 的线程模型是基于NIO的Selector 构建的,使用了异步驱动的Reactor 模式来构建的线程模型,可以很好的支持成百上千的 SocketChannel 连接.由于 READ/W ...

  7. SqlParameter用法

    if (id != null) { sql = @"update [User] set Username = @Username, Password = @Password, Type = ...

  8. 洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle

    P1607 [USACO09FEB]庙会班车Fair Shuttle 题目描述 Although Farmer John has no problems walking around the fair ...

  9. html的Vue.js框架概述

    前端的三大框架: Augular.js          由Google的研发团队最先写出 React.js            由facebook的团队继Augular.js之后写出 Vue.js ...

  10. PAT甲级——1101 Quick Sort (快速排序)

    本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90613846 1101 Quick Sort (25 分)   ...