cookie-session
是一个简单的基于 cookie 的会话中间件。
使用 cookie 可以通过两种主要方式存储用户会话:在服务器上或在客户端上。此模块将客户端上的会话数据存储在 cookie 中,而诸如express-session之类的模块 仅将客户端上的会话标识符存储在 cookie 中,并将会话数据存储在服务器上,通常存储在数据库中。
以下几点可以帮助您选择使用哪个:
cookie-session
不需要服务器端的任何数据库/资源,但总会话数据不能超过浏览器的最大 cookie 大小。cookie-session
可以简化某些负载均衡的场景。cookie-session
可用于存储“轻量级”会话并包含一个标识符以查找数据库支持的辅助存储以减少数据库查找。
安装
npm i cookie-session
API
var cookieSession = require('cookie-session')
var express = require('express')
var app = express()
app.use(cookieSession({
name: 'session',
keys: [/* secret keys */],
// Cookie Options
maxAge: 24 * 60 * 60 * 1000 // 24 hours
}))
cookieSession
使用提供的选项创建一个新的cookie
会话中间件。这个中间件将把属性会话附加到req
上,req
提供了一个表示加载的会话的对象。如果在请求中没有提供有效的会话,则该会话是一个新的会话,或者是从请求中加载的会话。
如果req.session
内容被改变,中间件会自动在响应中添加一个Set-Cookie
头。请注意,除非会话中有内容,否则响应中不会出现任何标头(因此不会为特定用户创建会话),所以如果您有要为会话存储的标识信息,一定要添加一些东西到 req.session
选项
Cookie 会话在选项对象中接受如下属性:
name
name
: 要设置的 cookie 的名称,默认为session
.
keys
用于签署和验证 cookie 值或配置 Keygrip
实例的密钥列表。设置的 cookie 始终使用 签名keys[0]
,而其他密钥对验证有效,允许密钥轮换。如果Keygrip
提供了实例,则可以使用它来更改签名参数,例如签名的算法。
secret
keys
如果未提供将用作单个键的字符串。
Cookie 选项
maxAge
: 从Date.now()
开始表示过期时间的毫秒数expires
: 一个Date
表示 cookie 过期日期的对象(默认在会话结束时过期)。path
: 表示 cookie 路径的字符串(/
默认情况下)。domain
: 表示 cookie 域的字符串(无默认值)。sameSite
: 一个布尔值或字符串,指示 cookie 是否为“同一站点”cookie(false
默认情况下)。这可以设置为'strict'
、'lax'
、'none'
或true
(映射到'strict'
)。secure
: 一个布尔值,指示 cookie 是否仅通过 HTTPS 发送(false
默认为 HTTP,true
默认为 HTTPS)。如果设置为true
并且 Node.js 不是直接通过 TLS 连接,请务必阅读如何在代理后面设置 Express,否则 cookie 可能无法正确设置。httpOnly
: 一个布尔值,指示 cookie 是否仅通过 HTTP(S) 发送,而不提供给客户端 JavaScript(true
默认情况下)。signed
: 一个布尔值,指示是否要对 cookie 进行签名(true
默认情况下)。overwrite
: 一个布尔值,指示是否覆盖以前设置的同名 cookie(true
默认情况下)。
销毁会话
要销毁会话,只需将其设置为null
:
req.session = null
使用
登录
login.js
const cookieSession = require('cookie-session')
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.urlencoded({ extended: false }))
app.set('trust proxy', 1) // trust first proxy
app.use(cookieSession({
name: 'mySession',
keys: ['key1', 'key2'],
// Cookie Options
maxAge: 24 * 60 * 60 * 1000 // 24 hours
}))
app.post('/login', function (req, res, next) {
req.session.username = req.body.username
res.send({flag: 1, data: {}})
})
app.listen(3000)
退出登录
logout.js
const logout = async (req, res, next) => {
res.set('Content-Type', 'application/json; charset=utf-8')
req.session = null
res.render('success', {
data: JSON.stringify({})
})
}