npm session

Node中cookie和session的使用

2019-03-05  本文已影响0人  笑笑料料

cookie

首先产生了 cookie 这门技术来解决这个问题,cookie 是 http 协议的一部分,它的处理分为如下几步:

const express = require('express')
const http = require('http')
const router = require('./router')
const path = require('path')
const cookieParser = require('cookie-parser')

const app = express()

// 第一步 设置签名 string
app.use(cookieParser('singedMyCookie'))

app.use(express.static(__dirname))

app.use('/api', router)

app.get('*', (req, res) => {
  const indexHtmlUrl = path.resolve(__dirname, './index.html')
  if (req.signedCookies.bwf) {
   // 第三步: 使用signedCookies获取cookie (采用签名形式获取cookie的方法:  req.signedCookies.
    console.log(req.signedCookies);
    res.send("再次欢迎访问");
  } else {
// 第二步: 设置{signed: true}
    res.cookie('bwf', '1234', {signed: true, maxAge: 6 * 1000, path: '/'})
    res.sendFile(indexHtmlUrl)
  }
})
http.createServer(app).listen(3000)

session

express 在 4.x 版本之后,session管理和cookies等许多模块都不再直接包含在express中,而是需要单独添加相应模块。express4 中操作 cookie 使用 cookie-parser 模块。
cookie 虽然很方便,但是使用 cookie 有一个很大的弊端,cookie 中的所有数据在客户端就可以被修改,数据非常容易被伪造,那么一些重要的数据就不能存放在 cookie 中了,而且如果 cookie 中数据字段太多会影响传输效率。为了解决这些问题,就产生了 session,session 中的数据是保留在服务器端的。

session 的运作通过一个 session_id 来进行。session_id 通常是存放在客户端的 cookie 中,比如在 express 中,默认是 connect.sid 这个字段,当请求到来时,服务端检查 cookie 中保存的 session_id 并通过这个 session_id 与服务器端的 session data 关联起来,进行数据的保存和修改。

这意思就是说,当你浏览一个网页时,服务端随机产生一个 1024 比特长的字符串,然后存在你 cookie 中的 connect.sid字 段中。当你下次访问时,cookie 会带有这个字符串,然后浏览器就知道你是上次访问过的某某某,然后从服务器的存储中取出上次记录在你身上的数据。由于字符串是随机产生的,而且位数足够 多,所以也不担心有人能够伪造。伪造成功的概率比坐在家里编程时被邻居家的狗突然闯入并咬死的几率还低。

session 可以存放在 1)内存、2)cookie本身、3)redis 或 memcached 等缓存中,或者4)数据库中。线上来说,缓存的方案比较常见,存数据库的话,查询效率相比前三者都太低,不推荐;cookie session 有安全性问题,下面会提到。

express 中操作 session 要用到 express-session (https://github.com/expressjs/session ) 这个模块,主要的方法就是session(options),其中 options 中包含可选参数,主要有:

1) 在内存中存储 session

const express = require('express')
const session = require('express-session')

const app = express()

app.use(session({
  secret: 'jinghong',
  cookie: { maxAge: 60 * 1000 }
}))

app.get('/', function (req, res) {
  if (req.session.isVisited) {
    req.session.isVisited ++
    res.send(`第${req.session.isVisited}访问`)
  } else {
    req.session.isVisited = 1
    res.send('第一次访问')
  }
})

app.listen(3000);

2) 在 redis 中存储 session
ession 存放在内存中不方便进程间共享,因此可以使用 redis 等缓存来存储 session。

假 设你的机器是 4 核的,你使用了 4 个进程在跑同一个 node web 服务,当用户访问进程1时,他被设置了一些数据当做 session 存在内存中。而下一次访问时,他被负载均衡到了进程2,则此时进程2的内存中没有他的信息,认为他是个新用户。这就会导致用户在我们服务中的状态不一致。

使用 redis 作为缓存,可以使用 connect-redis 模块(https://github.com/tj/connect-redis )来得到 redis 连接实例,然后在 session 中设置存储方式为该实例。

var express = require('express');var session = require('express-session');var redisStore = require('connect-redis')(session);var app = express();
app.listen(5000);

app.use(session({  // 假如你不想使用 redis 而想要使用 memcached 的话,代码改动也不会超过 5 行。
  // 这些 store 都遵循着统一的接口,凡是实现了那些接口的库,都可以作为 session 的 store 使用,比如都需要实现 .get(keyString) 和 .set(keyString, value) 方法。
  // 编写自己的 store 也很简单
  store: new redisStore(),
  secret: 'somesecrettoken'}));

app.get('/', function (req, res) {  if(req.session.isVisit) {
    req.session.isVisit++;
    res.send('<p>第 ' + req.session.isVisit + '次来到此页面</p>');
  } else {
    req.session.isVisit = 1;
    res.send('欢迎第一次来这里');
  }
});

原文:
https://niefengjun.cn/blog/576c6f44353308f7389956822726645b.html
https://segmentfault.com/a/1190000010306099

上一篇下一篇

猜你喜欢

热点阅读