(本文部分内容翻译自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('欢迎使用浏览次数统计功能!')
}
})