跨多个节点实例保存会话数据
Saving session data across multiple node instances
编辑 - 2017 年 10 月 22 日
我们的会话没有持续存在的原因不止一个,我不得不将我们的
快速会话选项更改为:
api.use(session({
secret: 'verysecretsecret',
resave: false,
saveUninitialized: false,
cookie: {
path: '/',
httpOnly: true,
domain: 'domain.dev',
maxAge: 1000 * 60 * 24
},
store: new MongoStore({ mongooseConnection: mongoose.connection, autoReconnect: true })
}));
显然 domain: 'localhost'
每次有人启动会话时 express-session 都会启动一个新会话,然后 refreshes/navigates 当您有一个单独的节点实例用于会话处理时离开和返回。
我通过执行以下操作解决了这个问题:
- 添加
127.0.0.1 domain.dev
到我的 hosts 文件,位于 C:\Windows\System32\drivers\etc.
- 根据下面给出的答案,我需要一个存储会话的地方,所以我们选择了 MongoDB。这意味着我必须将以下内容添加到我的快速会话选项中:
store: new MongoStore({ mongooseConnection: mongoose.connection, autoReconnect: true })
- 在快速会话选项中添加了
httpOnly: true
属性。
- 因为我们对 ajax 请求使用 jQuery,所以我必须在调用后端之前在前端 Web 应用程序中启用一些设置:
$.ajaxSetup({
xhrFields: { withCredentials: true },
crossDomain: true,
});
原创POST
我目前正在开发一个平台,该平台决定在端口 3001 上设置 API 运行,而 Web 应用程序本身在端口 3000 上设置 运行。做出此决定是为了进行监控交通更方便。
现在,我们正在谈论快速应用程序,所以我们默认使用 express-session npm 包。我想知道是否有可能保存存储在端口 3001 上的节点实例 运行 上的会话数据,如果有意义的话,由端口 3000 上的节点实例 运行 检索。
详细来说,这是我们的用户认证流程:
- 用户在端口 3000 上导航到我们的 Web 应用 运行。
- 用户然后登录,向端口 3001 上的 API 运行 发送 POST 请求,当凭证正确时存储会话数据,发送响应以便网络应用知道用户已通过身份验证。
- 用户在关闭浏览器后刷新页面或返回到 Web 应用程序,因此 Web 应用程序失去了经过身份验证的状态。因此在加载时它总是向端口 3001 上的 API 发送 GET 请求以检查是否有可用的会话数据,这意味着用户已登录,因此我们可以让 Web 应用程序知道用户已通过身份验证。
(如果我的思路在这里有问题,请告诉我)
问题是执行此操作时 express-session 似乎不起作用。
我启用了 CORS,因此 Web 应用程序能够将请求发送到 API。这就是快速会话配置的样子:
api.use(session({
secret: 'verysecretsecret',
resave: false,
saveUninitialized: false,
cookie: {
path: '/',
domain: 'localhost',
maxAge: 1000 * 60 * 24
}
}));
最好在不使用Redis之类的情况下帮助我解决这个问题,我只是想知道仅使用express-session和node是否可以解决这个问题。
Preferably help me solve this problem without using something like Redis
您希望我们最好在不使用正确工具的情况下帮助您解决这个问题。
如果没有 Redis,您将需要使用其他一些数据库。如果没有 "something like Redis"(即没有数据库),您将需要实现一些其他方法来处理一些书籍示例用例中的数据库。
如果您要使用数据库,那么对于需要在几乎每个请求上快速访问数据的事情,使用像 Redis 或 Memcached 这样的数据库是最合理的。如果您使用比这更慢的数据库,您的应用程序的性能将受到极大的影响。
I'd simply like to know if solving this problem is possible using just express-session and node.
是的。特别是当您将 express-session
与 Redis 一起使用时,正如 express-session
模块的文档中所建议的那样:
如果您的所有实例都在同一台机器上工作,那么您可以使用像 SQLite 这样的数据库将数据存储在文件系统中,但即使您的所有实例都在同一个机器上,我的建议还是仍然使用 Redis,因为它更简单,性能更高,并且在需要横向扩展的情况下也很容易做到。
此外,如果您的所有会话数据都可以毫无问题地放入 cookie,那么您可以使用此模块:
这会将所有会话数据存储在 cookie 中。 (感谢 Robert Klep 在评论中指出。)
编辑 - 2017 年 10 月 22 日
我们的会话没有持续存在的原因不止一个,我不得不将我们的
快速会话选项更改为:
api.use(session({
secret: 'verysecretsecret',
resave: false,
saveUninitialized: false,
cookie: {
path: '/',
httpOnly: true,
domain: 'domain.dev',
maxAge: 1000 * 60 * 24
},
store: new MongoStore({ mongooseConnection: mongoose.connection, autoReconnect: true })
}));
显然 domain: 'localhost'
每次有人启动会话时 express-session 都会启动一个新会话,然后 refreshes/navigates 当您有一个单独的节点实例用于会话处理时离开和返回。
我通过执行以下操作解决了这个问题:
- 添加
127.0.0.1 domain.dev
到我的 hosts 文件,位于 C:\Windows\System32\drivers\etc. - 根据下面给出的答案,我需要一个存储会话的地方,所以我们选择了 MongoDB。这意味着我必须将以下内容添加到我的快速会话选项中:
store: new MongoStore({ mongooseConnection: mongoose.connection, autoReconnect: true })
- 在快速会话选项中添加了
httpOnly: true
属性。 - 因为我们对 ajax 请求使用 jQuery,所以我必须在调用后端之前在前端 Web 应用程序中启用一些设置:
$.ajaxSetup({ xhrFields: { withCredentials: true }, crossDomain: true, });
原创POST
我目前正在开发一个平台,该平台决定在端口 3001 上设置 API 运行,而 Web 应用程序本身在端口 3000 上设置 运行。做出此决定是为了进行监控交通更方便。
现在,我们正在谈论快速应用程序,所以我们默认使用 express-session npm 包。我想知道是否有可能保存存储在端口 3001 上的节点实例 运行 上的会话数据,如果有意义的话,由端口 3000 上的节点实例 运行 检索。
详细来说,这是我们的用户认证流程:
- 用户在端口 3000 上导航到我们的 Web 应用 运行。
- 用户然后登录,向端口 3001 上的 API 运行 发送 POST 请求,当凭证正确时存储会话数据,发送响应以便网络应用知道用户已通过身份验证。
- 用户在关闭浏览器后刷新页面或返回到 Web 应用程序,因此 Web 应用程序失去了经过身份验证的状态。因此在加载时它总是向端口 3001 上的 API 发送 GET 请求以检查是否有可用的会话数据,这意味着用户已登录,因此我们可以让 Web 应用程序知道用户已通过身份验证。
(如果我的思路在这里有问题,请告诉我)
问题是执行此操作时 express-session 似乎不起作用。 我启用了 CORS,因此 Web 应用程序能够将请求发送到 API。这就是快速会话配置的样子:
api.use(session({
secret: 'verysecretsecret',
resave: false,
saveUninitialized: false,
cookie: {
path: '/',
domain: 'localhost',
maxAge: 1000 * 60 * 24
}
}));
最好在不使用Redis之类的情况下帮助我解决这个问题,我只是想知道仅使用express-session和node是否可以解决这个问题。
Preferably help me solve this problem without using something like Redis
您希望我们最好在不使用正确工具的情况下帮助您解决这个问题。
如果没有 Redis,您将需要使用其他一些数据库。如果没有 "something like Redis"(即没有数据库),您将需要实现一些其他方法来处理一些书籍示例用例中的数据库。
如果您要使用数据库,那么对于需要在几乎每个请求上快速访问数据的事情,使用像 Redis 或 Memcached 这样的数据库是最合理的。如果您使用比这更慢的数据库,您的应用程序的性能将受到极大的影响。
I'd simply like to know if solving this problem is possible using just express-session and node.
是的。特别是当您将 express-session
与 Redis 一起使用时,正如 express-session
模块的文档中所建议的那样:
如果您的所有实例都在同一台机器上工作,那么您可以使用像 SQLite 这样的数据库将数据存储在文件系统中,但即使您的所有实例都在同一个机器上,我的建议还是仍然使用 Redis,因为它更简单,性能更高,并且在需要横向扩展的情况下也很容易做到。
此外,如果您的所有会话数据都可以毫无问题地放入 cookie,那么您可以使用此模块:
这会将所有会话数据存储在 cookie 中。 (感谢 Robert Klep 在评论中指出。)