javascript - 用 cookie 或 localstorage 替换 sails.js redis session 存储

标签 javascript express session sails.js

我们的团队正在使用 Sails.js 框架维护一个应用程序,该应用程序充当较大应用程序的管理面板,因此不会看到太多流量。为了简化它并最大程度地减少移动部件,我们希望删除 sails 默认情况下用于其 session 存储的 Redis 依赖项 ( https://sailsjs.com/documentation/reference/configuration/sails-config-session )。

我们更愿意用用户计算机上的 cookie 存储或 LocalStorage 替换 session 存储。 Sails.js 声称他们的 session 存储严重依赖于express 的 session 存储。我们偶然发现了一个基于 cookie 的商店 ( https://github.com/expressjs/cookie-session ),但我对集成它感到困惑。我看到config/session.js Sails 中的文件为其 session 存储定义了一个适配器,但我假设如果没有额外的包装器,它将与上述库不兼容。搜索 Sails 适配器将我带到数据库适配器而不是 session 存储适配器。我是否把这个问题过于复杂化了?上面的库(或者可能是一个简单的 LocalStorage 替代方案)可以绑定(bind)到 Sails 中来代替 Redis 吗?

最佳答案

我想可能是你把事情搞得太复杂了。这里有几个选项供您选择:

选项 1:默认 Sails session 存储

Sails 开箱即用,使用捆绑在底层 session 中间件中的默认内存存储。该 session 存储是内存存储,因此; a) 无法通过单个实例进行扩展,b) 要求每个用户在重新启动 Sails 应用程序后再次登录,c) 不建议用于生产环境。

话虽如此,我目前正在生产应用程序中使用默认内存存储。该应用程序非常基础且非常稳定,大约每季度进行一次更改。重新启动后,用户只需再次登录即可重新创建 session 。

对于首次启动应用程序来说,这无疑是一个可靠的选择,特别是如果您没有计划在不久的将来将其扩展到多个服务器。

要使用默认的 Sails session 存储,请不要对 config/session.js 文件进行任何更改,或者如果您已经配置了 Redis,请务必在 config/session.js 中注释掉以下行:

// adapter: 'redis',

// host: 'localhost',
// port: 6379,
// ttl: <redis session TTL in seconds>,
// db: 0,
// pass: <redis auth password>,
// prefix: 'sess:',

选项 2:可扩展的缓存存储

由于 Sails session 集成在很大程度上依赖于 Express 和 Connect,因此只要使用兼容版本,您就可以使用为 Connect/Express with Sails 编写的任何 session 适配器。

可提供基于 Connect 的兼容 Express session 存储的完整列表 here .

当谈到设计特定的缓存存储时,我认为两个明显的选择是 Memcached利用可用的 connect-memjs 包 hereRedis Sails 开箱即用地支持。

Memcached 是一个简单的 volatile 缓存服务器。它允许您存储最多 1MB 的键/值对,因为 Redis 不仅仅是一个缓存服务器,但也可以充当缓存,存储最多 512MB 的键/值对。有关 Redis 与 Memcached 的更完整比较,请参阅 here .

选项 3:使用数据库

如果您的堆栈中已经配置了 Mongo、Couch、Dynamo 或 MSSql 数据库,则可以考虑将其用作 session 存储。他们都已经有了基于 Connect 的软件包。可以在上面基于 Connect 的兼容 Express session 存储的完整列表中找到每个链接的链接。

选项 2 和 3 的设置非常相似。示例可以在 Sails.js 网站上您提到的页面上找到。设置像 Mongo 这样的数据库非常简单:

A) 安装 connect-mongo 包

npm install connect-mongo --save

B) 更改 config/session.js 中的适配器:

adapter: 'connect-mongo',

C) 添加与您的数据库相关的可选适配器值:

url: 'mongodb://user:pass@host:port/database',
collection: 'sessions',
auto_reconnect: false,
ssl: false,
stringify: true

或者:Cookie

如果您根本不需要 session 。正如您提到的,您可以通过使用 cookie 将许多此功能推送给客户端。

Sails 内置了 getting 的功能和 setting cookies 。

关于管理 Cookie,您可以在基于 Controller 的 Cookie 的 Controller 级别执行此操作,也可以在获取更多全局数据的中间件中执行此操作。

要获取传入请求的 cookie,您可以使用点表示法。例如:

req.cookies.username;

要在响应上设置 cookie,您可以使用 JSON。例如:

res.cookie('username', 'John Smith', { maxAge: 900000, httpOnly: true });

在我看来,采用这种替代方案会产生大量的手动开销。您还必须考虑安全隐患,因为存储在 cookie 中的所有信息都可以通过浏览器的开发人员控制台访问。与使用 Sails session 相比,客户端只有 Sails 生成的 session ID 可用。

关于javascript - 用 cookie 或 localstorage 替换 sails.js redis session 存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47777385/

相关文章:

javascript - Div 无法放入其容器内,并且它们添加了像素。

javascript - 如何在 JavaScript 中解构数组数组?

php - session 错误 - 权限被拒绝 (13)

asp.net - IIS session 超时与 ASP.NET session 超时

javascript - 像按钮一样在 facebook 顶部覆盖关闭按钮,但保留功能

javascript - 在sql查询结果中添加新行

node.js - 在没有模板引擎的情况下使用 express

express.js 无法直接获取 url 的 hash 段?

node.js - 如何在 Nodejs 中使用环境变量作为数据库密码?

node.js - 如何在 node.js 中生成 session ID?