使用express-session实现express服务器的session处理

(本文部分内容翻译自express官方文档)

1.引入express-session中间件

首先安装express-session

npm install -s express-session

创建express服务器对象

var app = express();

在express服务器的app.js中引入express-session 

var session = require('express-session');

app.set('trust proxy', 1) // trust first proxy
app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true }
}))

也可以根据服务器的模式(development/production)进行不同设置

var sess = {
  secret: 'keyboard cat',
  cookie: {}
}

if (app.get('env') === 'production') {
  app.set('trust proxy', 1) // trust first proxy
  sess.cookie.secure = true // serve secure cookies
}

app.use(session(sess))

1.1 secret

用于加密的128位安全字符串,可以任意设置,也可以是一个数组,当为数组时,第一个字符串用于加密,而全部的字符串将用于解析——当请求无法用第一个字符串解析时,将依次尝试后续的字符串。

1.2 resave

强制保存session,即便我们没有对收到的请求主动设置session,依然会对每个请求自动存储一个session,这个功能很实用,但是也可能产生问题。比如一个浏览器同时发送了两条请求,则两条请求的session可能会相互覆盖。

1.3 saveUninitialized

允许保存一个“未被初始化”的session。当我们创建了session却未设置参数时,session为“uninitialized”状态。

1.4 cookie

是一个对象,设置cookie相关的属性常用的如下:

cookie.secure:设置Secure Set-Cookie的布尔值,为true时设置Secure,否则不设置,默认不设置。secure:true为推荐值,但是要求服务器必须使用HTTPS连接,通过HTTP协议进行的请求将不会设置session。如果secure为true,且服务器运行在代理服务器之后,则需要额外设置“trust proxy”选项。如果服务器只支持HTTP协议,请设置为false。另:secure可以设置为auto,此时session会同时支持HTTP和HTTPS,但是设置在HTTPS请求上的session无法在HTTP请求上使用。

cookie.expires:一个日期对象,设置Expires Set-Cookie参数,如果同时由expires和maxAge属性,则取后设置的那个属性。

cookie.httpOnly:设置HttpOnly Set-Cookie的布尔值

cookie.maxAge:设置超时的毫秒数,超时时间为当前时间+毫秒数,如果同时由expires和maxAge属性,则取后设置的那个属性。

cookie.path:设置Path Set-Cookie,默认为'/'

cookie.sameSite:设置SameSite Set-Cookie属性,有true/false/'lax'/'strict'四种属性(暂定,将来可能更改)

1.5 genid

是一个函数,返回一个字符串作为请求的session ID,该函数的第一个参数为req——请求对象,可以针对请求的参数设置特殊的session ID。默认值为使用secret属性值进行加密的函数。

1.6 name

session ID存储在cookie中的名字,默认为'connect.sid'。设置不同name可以区分同一个服务器上多个app的session ID。

1.7 proxy

是否信任分发代理服务器。true表示使用“X-Forward-Proto”请求头。false表示忽略所有请求头,只接受直接的TSL/SSL请求。undefined(未设置)则使用express对象的“trust proxy”属性。

2.使用session

设置好express-session中间件后,所有请求的req(请求对象)都带有req.session对象,直接设置req.session就可以存储session信息,同样的,下次请求时,服务器将自动读取cookie密钥,获取上次的session信息,使用req.session可以读取同一个客户端的session信息。

// 统计浏览次数
app.get('/', function(req, res, next) {
  if (req.session.views) {
    req.session.views++
    res.setHeader('Content-Type', 'text/html')
    res.write('<p>您已浏览 ' + req.session.views + '次</p>')
    res.write('<p>记录将在 ' + (req.session.cookie.maxAge / 1000) + '秒后失效</p>')
    res.end()
  } else {
    req.session.views = 1
    res.end('欢迎使用浏览次数统计功能!')
  }
})
发布了19 篇原创文章 · 获赞 0 · 访问量 1456

猜你喜欢

转载自blog.csdn.net/Z_ammo/article/details/103563905