express - 为什么在使用 connect-redis 进行会话管理时,redis 密钥会随着每个请求而不断增加?
问题描述
我正在使用connect-redis
v3.x 来管理我的风帆应用程序的会话(使用快速会话)。
一切都按照指南进行设置,并且在前端看到时它可以正常工作,例如当我重新启动服务器时,会话保持不变并且用户已登录。
但是当我检查时,redis-cli
我发现每个 http 请求都添加了一个密钥;这是理想的行为吗?当系统扩展时,这将对存储造成很大负担,因为每个请求都会在 redis 中输入。
我不明白这是如何工作的,但我希望当用户登录时,它将存储会话 ID 和 cookie 信息,稍后将用于匹配身份验证信息;无论用户在登录后发出多少请求,它都会使用相同的会话 ID 和 cookie 信息来验证用户。我错了还是我配置错误?
编辑:正如@japrescott 指出的那样,这不是一个理想的行为。我正在添加更多信息以找出问题所在。
更多观察:
我在服务器上多次记录传入请求,我观察到了这一点
req.session.id
所有请求都保持不变。即使用户注销,它也保持不变。
//req.session.id
Request#1: c_FfYp3ueX0DsGLC0WSLt
Request#2: c_FfYp3ueX0DsGLC0WSLt
req.session.cookie
并req.cookies
给出不同的输出。对于每个请求,唯一更改的req.session.cookie
是expires
字段
//req.session
Request#1 : {"cookie":{"originalMaxAge":2332799997,"expires":"2019-11-22T04:51:24.325Z","httpOnly":true,"path":"/"},"messages":{"success":[],"error":[],"warning":[]},"timezone":"Asia/Calcutta","passport":{"user":"5bc9b1559e47b71da3a61d5a"}}
Request#2 : {"cookie":{"originalMaxAge":2332799997,"expires":"2019-11-22T05:55:24.325Z","httpOnly":true,"path":"/"},"messages":{"success":[],"error":[],"warning":[]},"timezone":"Asia/Calcutta","passport":{"user":"5bc9b1559e47b71da3a61d5a"}}
//req.cookies
{"_ga":"GA1.1.1355665360.1522218513","_hjid":"687665e4-38a4-4355-912c-6045e67acc00","_hjIncludedInSample":"1","io":"J-5QVd1ufdDchLv7AAbA","_gid":"GA1.1.1355665360.1522218513","_gat_UA-73956964-3":"1"}
sails.sid
在客户端,cookie 通过似乎正常工作的名称正确设置为会话。它的expires
字段在登录时更改,并且在整个登录会话期间保持不变。- 当我使用 option
saveUninitialized: false
时,redis 不会为会话存储任何键值对(甚至没有一次,甚至在登录时也没有)
该问题在 Firefox 上无法重现。redis 中没有额外的条目。但是上面的日志显示了与以上 4 点相同的行为,即使是 Firefox。
在不同操作系统的 Chrome 上可以重现问题。
这就是存储在 redis 中的多个条目(仅显示值)的样子
Saved on Request#1(login) : {\"cookie\":{\"originalMaxAge\":2332799999,\"expires\":\"2019-11-22T05:40:39.017Z\",\"httpOnly\":true,\"path\":\"/\"},\"messages\":{\"success\":[],\"error\":[],\"warning\":[]},\"timezone\":\"Asia/Kolkata\",\"passport\":{\"user\":\"5bc9b1559e47b71da3a61d5a\"}}
Saved on Request#2 : "{\"cookie\":{\"originalMaxAge\":2332800000,\"expires\":\"2019-11-22T05:57:06.225Z\",\"httpOnly\":true,\"path\":\"/\"}}"
Saved on Request#3 : "{\"cookie\":{\"originalMaxAge\":2332800000,\"expires\":\"2019-11-22 T05:57:11.186Z\",\"httpOnly\":true,\"path\":\"/\"}}
这是从客户端接收到服务器的完整请求标头
//Request from Chrome
{
"host": "localhost:3000",
"connection": "keep-alive",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
"accept-encoding": "gzip, deflate, br",
"accept-language": "en-US,en;q=0.9",
"referer": "http://localhost:3000/user/dashboard",
"cookie": "_ga=GA1.1.1dsd50.15dsfs8814; _hjid=dsf665e4-sfsdd-4dfd-912c-dsfsdfsdf; _hjIncludedInSample=1; io=J-dsfsd; _gid=GA1.1.1dsfdxx.dfdfxxw064; sails.sid=s%3A0TILcXehUjhcPDykvxwopctILbBJB2pe.ts95dvdwV9nktKeCO6%2BNahMuJ3TrWb5h%2F8%2BccRiTap0",
"sec-fetch-mode": "navigate",
"sec-fetch-user": "?1",
"sec-fetch-site": "same-origin",
"dnt": "1",
}
//Request from Firefox
{
"host": "localhost:3000",
"connection": "keep-alive",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0",
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"accept-language": "en-US,en;q=0.5",
"accept-encoding": "gzip, deflate",
"referer": "http://localhost:3000/user",
"cookie": "_ga=GA1.1.1afdsfdscd42.15dsfdsfs28; _hjid=b6asdfsd6-sdfds0df-4sd2b-8sdfd-0sdfsdb99b4; sails.sid=s%3AAUruqhip_1eTZjWq4FHMAajfdFiYpN5o.xjI8R8x04IX8MGIXHCyT1xw9ErvZdsfd2MJciToUE; _gid=GA1.1.7sdfsd86.1dsfsd3207; _hjIncludedInSample=1",
"if-none-match": "W/\"4a44-s94WDFGXnSin4kOElQeWwQ\""
}
解决方案
推荐阅读
- .net - 疑难解答 - 如何在 Windows 2008 Server SP2 上启用 TLS 1.2
- rust - 有没有办法在 Serde 的序列化输出中添加一个常量字段?
- sql - 从 SQL Server 中的 XML 数据类型字段中提取数据
- css - 相对于子组件定位父组件
- mysql - MySQL计算空值
- python - sklearn:无法从“sklearn.utils”导入名称“可索引”
- python-3.x - Spacy -- ImportError: preshed.maps 没有导出预期的 C 函数 map_clear
- c - 将 __attribute__((used)) 设置为 C 变量/常量无效
- spring - 将 Spring Boot Webflux 应用 WAR 部署到 Tomcat 8
- jpos - jpos:构建突然无缘无故失败