用cookie或localstorage替换sails.js redis会话存储

时间:2017-12-12 16:33:38

标签: javascript express session sails.js

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

我们希望用会在用户计算机上的cookie商店或LocalStorage替换会话商店。 Sails.js声称他们的会话商店在很大程度上依赖于快递会话商店。我们偶然发现了一个基于cookie的商店(https://github.com/expressjs/cookie-session),但我对于整合它感到很困惑。我看到Sails中的config/session.js文件为其会话存储定义了一个适配器,但是我假设如果没有额外的包装器,它将与上面的库不兼容。搜索Sails适配器将我带到数据库适配器而不是会话存储适配器。我是不是太复杂了?可以将上面的库(或者简单的LocalStorage替代品)绑定到Sails代替Redis吗?

1 个答案:

答案 0 :(得分:1)

我想可能是你过度复杂的情况。以下是一些选项:

选项1:默认的Sails会话商店

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

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

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

要使用默认的Sails会话存储,不要对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会话集成严重依赖于Express和Connect,因此只要使用兼容版本,就可以使用为Sails编写的任何会话适配器。

可以使用兼容的基于Connect的Express会话存储的完整列表here

当谈到设计特定的缓存存储时,我认为两个显而易见的选项是Memcached利用了可用的{-3}}和here的连接记忆包,Sails支持盒子。

Memcached是一个简单的易失性缓存服务器。它允许您存储限制为最大1MB的字符串的键/值对,其中Redis比缓存服务器多一点,但也可以充当缓存,存储高达512MB的键/值对。有关Redis vs Memcached的更完整比较,请参阅Redis

选项3:使用数据库

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

选项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

如果您根本不需要会话。您可以如您所述,通过使用cookie将大量此功能输出到客户端。

Sails内置了heregetting Cookie的功能。

关于管理cookie,您可以在基于控制器的cookie的控制器级别或在更多全局数据的中间件中执行此操作。

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

req.cookies.username;

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

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

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