🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# express-session express-session中间件将会话数据存储在服务器上;它仅将会话标识(而非会话数据)保存在 cookie 中。从1.5.0版本开始, express-session不再依赖cookie-parser,直接通过req/res读取/写入;默认存储位置内存存储(服务器端) ## API ### session(options) 使用给定选项创建session中间件。 **注意** session数据不会保存在cookie本身中,只会保存在session ID中。 会话数据存储在服务器端。 **注意** 从1.5.0版开始, 此模块不再依赖 cookie-parser 中间件才能运行。 此模块现在直接在req / res上读取和写入cookie。 如果此模块和cookie-parser之间的 secret 不同,则使用cookie-parser可能会导致问题。 **警告** 默认的服务器端session 存储MemoryStore不是特意为生产环境设计的。 它会在大多数情况下泄漏内存,不会扩展到单个进程,并且用于调试和开发。 #### Options * name - cookie的名字(原属性名为 key)。(默认:’connect.sid’) * store - session存储实例 * secret - 用它来对session cookie签名,防止篡改(必填项) * cookie - session cookie设置 (默认:{ path: ‘/‘, httpOnly: true,secure: false, maxAge: null }) * genid - 生成新session ID的函数 (默认使用uid2库) * rolling - 在每次请求时强行设置cookie,这将重置cookie过期时间(默认:false) * resave - 强制保存session即使它并没有变化 (默认: true) * proxy - 当设置了secure cookies(通过”x-forwarded-proto” header )时信任反向代理。当设定为true时, * ”x-forwarded-proto” header 将被使用。当设定为false时,所有headers将被忽略。当该属性没有被设定时,将使用Express的trust proxy。 * saveUninitialized - 强制将未初始化的session存储。当新建了一个session且未设定属性或值时,它就处于未初始化状态。在设定一个cookie前,这对于登陆验证,减轻服务端存储压力,权限控制是有帮助的。(默认:true) * unset - 控制req.session是否取消(例如通过 delete,或者将它的值设置为null)。这可以使session保持存储 * 状态但忽略修改或删除的请求(默认:keep) <br> ### req.session 要存储或访问会话数据,只需使用请求属性req.session,该属性由store(通常)序列化为JSON,因此嵌套对象通常很好。 ~~~ // Use the session middleware app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }})) // Access the session as req.session app.get('/', function(req, res, next) { if (req.session.views) { req.session.views++ res.setHeader('Content-Type', 'text/html') res.write('<p>views: ' + req.session.views + '</p>') res.write('<p>expires in: ' + (req.session.cookie.maxAge / 1000) + 's</p>') res.end() } else { req.session.views = 1 res.end('welcome to the session demo. refresh!') } }) ~~~ <br> ### Session.regenerate(callback) 要重新生成session,只需调用该方法即可。 完成后,将在req.session初始化新的SID和Session实例,并将调用回调。 ~~~ req.session.regenerate(function(err) { // will have a new session here }) ~~~ <br> ### Session.destroy(callback) 销毁session并取消设置req.session属性。 完成后,将调用回调。 ~~~ req.session.destroy(function(err) { // cannot access session here }) ~~~ <br> ### Session.reload(callback) 从存储重新加载session数据并重新填充req.session对象。 完成后,将调用回调。 ~~~ req.session.reload(function(err) { // session updated }) ~~~ <br> ### Session.save(callback) 将会话保存回store,用内存中的内容替换store中的内容(尽管store可能会做其他事情 - 请参阅store的文档以了解确切的行为)。 如果session数据已被更改,则在HTTP响应结束时会自动调用此方法(尽管可以使用中间件构造函数中的各种选项更改此行为)。 因此,通常不需要调用此方法。 在某些情况下,调用此方法很有用,例如,重定向,长期请求或WebSockets。 ~~~ req.session.save(function(err) { // session saved }) ~~~ <br> ### Session.touch() 更新.maxAge属性。 通常这不需要调用,因为session中间件为您执行此操作。 <br> ### req.session.id 每个会话都有一个与之关联的唯一ID。 此属性是req.sessionID的别名,无法修改。 <br> ### req.session.cookie 每个session都附带一个唯一的cookie对象。 这允许您更改每个访问者的会话cookie。 例如,我们可以将req.session.cookie.expires设置为false,以使cookie仅在用户代理的持续时间内保留。 <br> ### Cookie.maxAge `req.session.cookie.maxAge` 将返回剩余的时间(以毫秒为单位),我们也可以重新分配一个新值来适当调整.expires属性。 以下几乎是等效的 ~~~ var hour = 3600000 req.session.cookie.expires = new Date(Date.now() + hour) req.session.cookie.maxAge = hour ~~~ 例如,当maxAge设置为60000(一分钟),并且经过30秒后,它将返回30000,直到当前请求完成,此时调用req.session.touch()将req.session.maxAge重置为其初始值。 ~~~ req.session.cookie.maxAge // => 30000 ~~~ <br> ### req.sessionID 要获取已加载session的ID,请访问请求属性req.sessionID。 这只是在加载/创建session时设置的只读值。